2012-01-05 18 views
12

Tôi đang sử dụng LINQ to tổ chức tôi đã sau truy vấnbiểu DbSortClause phải có một loại đó là để so sánh tham số Name: Key

IQueryable<DomainModel.User> userResult = 
     userResult.OrderBy(u => u.UserClientRoles.OrderBy(r => r.Role.RoleName)); 

Nhưng tôi nhận được

biểu DbSortClause phải có một loại đó là để so sánh

Tên tham số: Key

lỗi và nó trả về 0 colletction.

Bất kỳ ý tưởng nào về điều này.

Trả lời

17

.OrderBy(), khi làm việc với cơ sở dữ liệu, được cho là nhận một đại biểu chỉ trả về một thuộc tính duy nhất đại diện cho một cột trong cơ sở dữ liệu của bạn. Tôi không chắc chắn những gì bạn đang cố gắng để làm, nhưng có vẻ như

u.UserClientRoles.OrderBy(r => r.Role.RoleName) 

sẽ trả về một liệt kê các giá trị, mà không thể được đặt hàng.

+0

Có đúng là bạn trả về enumartion của các giá trị. Sau đó tôi có thể đạt được thứ tự bằng cách nào? Xin vui lòng nếu bạn có bất kỳ ý tưởng cho tôi biết. –

+0

Nếu bạn có thể giải thích cách bạn muốn danh sách các vai trò ảnh hưởng đến thứ tự của userResult, tôi có thể giúp tìm ra nó cho bạn. Ví dụ: lấy RoleName đầu tiên trong danh sách hoặc số lượng vai trò, v.v. –

+0

Một câu lệnh đó sẽ 'trả về một liệt kê các giá trị, không thể ra lệnh' đã làm hai việc: khiến tôi cảm thấy như một thằng ngốc không suy nghĩ về cách một bộ có thể được sử dụng để đặt hàng một cái gì đó, và đã cho tôi suy nghĩ về những gì tôi * thực sự * muốn sử dụng để đặt hàng bộ của tôi. Cảm ơn! – cjbarth

9

tôi đã cùng một vấn đề, tôi giải quyết nó bằng cách sử này:

mã của bạn:

IQueryable<DomainModel.User> userResult = userResult.OrderBy(u => u.UserClientRoles.OrderBy(r => r.Role.RoleName));

mã của tôi:

List<Membership> results = new List<Membership>(); results.AddRange(memberships.OrderBy(m => m.Roles)); memberships = results.AsQueryable();

trùng hợp ngẫu nhiên:

*.OrderBy(m => m.Roles)

giải pháp:

*.OrderBy(m => m.Roles.Select(r => r.RoleId).FirstOrDefault())

lý do

có thể vấn đề của:

Có lẽ, bạn đã làm những gì tôi đã làm, và gây ra điều đó 1 người dùng/thành viên có thể có nhiều hơn 1 vai trò trong cùng một thành viên. Điều đó gây ra xung đột với/với OrderBy() vì ứng dụng chỉ có thể "đặt hàng" một phần tử vào thời điểm đó, khi cô gọi Vai trò (là một phần tử ICollection) thay vào đó nhận được nhiều hơn 1 phần tử không có loại ưu tiên các mức (ngay cả khi chúng ta có thể giả định rằng ứng dụng sẽ lấy chỉ mục của vai trò là mức cơ sở ưu tiên, thực sự nó không). Giải thích

giải pháp của:

Khi bạn thêm *.Select(r => r.RoleId), bạn đang xác định cho các ứng dụng mà phần tử sẽ được sử dụng để OrderBy(). Nhưng, như bạn sẽ thấy khi bạn có thể đạt được vào thời điểm này, chỉ bằng cách sử dụng *.Select(r => r.RoleId) có thể không đủ, bởi vì ứng dụng vẫn nhận được nhiều kết quả với cùng mức độ ưu tiên. Thêm *.Select(r => r.RoleId).FirstOrDefault() về cơ bản bạn nói: "... Tôi không quan tâm bạn nhận được bao nhiêu kết quả từ phần tử đó, chỉ tập trung vào kết quả đầu tiên, hoặc sắp xếp chúng theo mặc định ..." (mặc định thường có nghĩa là EMPTY hoặc NULL).thêm

thông tin:

tôi đã sử dụng khái niệm đơn giản không chính thức của/ý nghĩa để giải thích một giải pháp phức tạp với các từ đơn giản, có nghĩa là bạn có thể có thể có vấn đề để tìm bài tương tự trong các trang web bằng cách sử dụng các từ/khái niệm được sử dụng trong "câu trả lời" này. Nếu không, mã này hoạt động và bạn không nên có bất kỳ vấn đề nào bằng cách áp dụng nó và/hoặc tự sửa đổi nó. CHÚC MAY MẮN!!! (^_^)

+0

Không phải là một ý tưởng hay vì bạn sẽ sắp xếp kết quả của mình bằng .NET chứ không phải trong SQL –

1

Trong trường hợp của tôi, tôi vô tình cố gắng đặt hàng bởi một đối tượng thay vì đặt hàng bởi một trong các thuộc tính của nó.

Bạn bạn nên sử dụng

var query = from Foo in Bar 
      orderby Foo.PropertyName 
      select Foo; 

Thay vì

var query = from Foo in Bar 
      orderby Foo 
      select Foo; 

Lưu ý: bạn sẽ nhận được sự kiện hành vi tương tự nếu có một ghi đè trên ToString Foo 's() phương pháp .

Các vấn đề liên quan