2011-12-13 3 views
5

Tôi đã vật lộn để làm việc này. Tôi muốn có một tuyên bố của EF lấy một cột để đặt hàng. tuyên bố ban đầu của tôi là thế này:Khung thực thể và thứ tự động theo các phát biểu

var Query = from P in DbContext.People 
        where P.BusinessUnits.Any(BU =>BU.BusinessUnitID == businessUnitId) 
        orderby P.LastName 
        select P; 

Và tôi đã thay đổi này như sau:

var Query = from P in DbContext.People 
        where P.BusinessUnits.Any(BU =>BU.BusinessUnitID == businessUnitId) 
        orderby sortField 
        select P; 

đâu sortField là cột chúng ta muốn sắp xếp trên, và là một chuỗi ví dụ: LastName. Tuy nhiên, nó không xuất hiện để làm việc, nó không phân loại, và chuỗi SQL được xuất ra là hoàn toàn sai. Có ai làm việc này trước đây không?

Trả lời

11

bạn có thể thử qua trong một biểu thức với phương pháp của bạn với các loại sau đây:

Expression<Func<Person, object>> expr = p => p.LastName; 

và sau đó sử dụng phần mở rộng LINQ thay vì các biểu thức LINQ ...

var Query = 
DbContext.People 
.Where(P => P.BusinessUnits.Any(BU =>BU.BusinessUnitID == businessUnitId)) 
.OrderBy(expr) 
.ToList(); 
+0

xuất sắc trả lời, trong trường hợp đặc biệt này, điều này dường như là một giải pháp tốt hơn vì vậy tôi sẽ sử dụng này, cảm ơn. – eyeballpaul

+0

Có cách nào để thêm vào mệnh đề "asc" và "desc" ở đây không? – eyeballpaul

+0

Ngoài ra, tại sao điều này sẽ làm việc với các thuộc tính chuỗi và không phải là số nguyên? Một trong các thuộc tính là Int32 và khi tôi cố gắng sắp xếp theo thứ tự đó, tôi nhận được lỗi: "{" Không thể truyền kiểu 'System.Int32' để nhập 'System.Object'. LINQ to Entities chỉ hỗ trợ đúc các kiểu nguyên thủy của Mô hình thực thể. "}" – eyeballpaul

3

loại của bạn không hoạt động vì bạn đang sắp xếp theo chuỗi ký tự. Nó không phải là bất hợp pháp, nhưng nó không phải là đặc biệt hữu ích hoặc. Bạn cần cung cấp một lĩnh vực phân loại thông qua API của IQueryable<T>, ví dụ, như thế này:

var q = from P in DbContext.People 
    where P.BusinessUnits.Any(BU =>BU.BusinessUnitID == businessUnitId) 
    orderby P.LastName 
    select P; 
if ("sortField".Equals("FirstName")) 
    q = q.OrderBy(p => p.FirstName); 
else if ("sortField".Equals("LastName")) 
    q = q.OrderBy(p => p.LastName); 
else if ("sortField".Equals("Dob")) 
    q = q.OrderBy(p => p.Dob); 
+0

Câu trả lời hay. Trong trường hợp cụ thể này, tôi đang sử dụng câu trả lời của BobTodd, tuy nhiên tôi sẽ ghi nhớ điều này cho một số truy vấn động mà tôi sẽ sớm xây dựng. – eyeballpaul