2011-11-10 32 views
19

Tôi có một số dữ liệu sắp ra của một DB mà tôi không thể dễ dàng thay đổi lược đồ. Tôi muốn sắp xếp nó và liên kết nó với một điều khiển dựa trên một số ID. Vấn đề là API lưu trữ số trong một trường chuỗi thay vì như là một thanh công cụ int và LINQ trên nỗ lực chuyển đổi.Làm thế nào để OrderBy một số nguyên trong một trường chuỗi trong một truy vấn LINQ

myControl.DataSource = dataFromDB.OrderBy(o => int.Parse(o.StringHoldingAnInt)); 

LINQ to Entities không nhận ra phương pháp 'Int32 Parse (System.String)' phương pháp, và phương pháp này không thể được dịch sang một biểu hiện cửa hàng.

Convert.ToInt32 cũng không hoạt động.

LINQ to Entities không nhận ra phương thức 'Int32 ToInt32 (System.String)' và phương pháp này không thể được dịch sang biểu thức cửa hàng.

Phân loại như là một chuỗi là không phù hợp vì các giá trị không phải là tất cả cùng độ dài và nó sẽ ra lệnh cho họ như thế này: 1, 10, 11, 2, 3 ..

+0

bao nhiêu dữ liệu là có? Nó sẽ là khả thi để sắp xếp ở phía khách hàng? – dlev

+0

Bạn có thể cố gắng để pad chuỗi với '0' để tất cả đều có cùng độ dài ... nhưng tôi không chắc chắn String.PadLeft được hỗ trợ bởi LINQ. –

+0

@dlev vài trăm hàng trong DB, chỉ vài chục hàng sau truy vấn Where() tôi bỏ qua từ câu hỏi của mình. –

Trả lời

14

won này' t gần như hiệu quả vì bạn không khai thác truy vấn cơ sở dữ liệu để lọc kết quả của bạn, nhưng điều này về cơ bản sẽ truy vấn tất cả dữ liệu, sau đó lọc trên máy khách.

myControl.DataSource = dataFromDB.ToList().OrderBy(o => int.Parse(o.StringHoldingAnInt)); 
+0

Truy vấn chưa được rút gọn của tôi thực hiện lệnh Where() trước lệnh theo thứ tự để giảm lượng dữ liệu xuống một kích thước hợp lý, do đó gánh nặng xử lý phía máy khách không quá lớn. –

1

Bạn có thể chuyển đổi các truy vấn vào một danh sách:

var query = ...; 
var list = query.ToList(); 

Bây giờ bạn có thể đặt hàng bằng các giá trị bằng cách chuyển đổi nó:

list.OrderBy(o => int.Parse(o.StringHoldingAnInt)); 

Vấn đề ở đây là bạn đang lấy rất nhiều giá trị mà tất cả chúng đều đến từ cơ sở dữ liệu và sau đó bạn đặt hàng trong bộ nhớ.

+3

Vì vậy, không ai bị nhầm lẫn, '.OrderBy()' trả về một 'IEnumerable'. Dòng 'list.OrderBy()' ở trên sẽ không làm gì cả, vì bạn không gán giá trị trả về từ '.OrderBy()' cho một biến. –

1

Có thể thực hiện điều đó ở phía DB. Ý tưởng được lấy từ here. Vì vậy, nó không sắp xếp theo định dạng đúng chuỗi (zero chars được thêm vào bên trái và sau đó số lượng cần thiết của chars được lấy từ bên phải)

myControl.DataSource = dataFromDB 
    .OrderBy(o => DbFunctions.Right("00000" + o.StringHoldingAnInt, 7)); 
Các vấn đề liên quan