2009-07-20 7 views
8

Tôi có mã đơn vị sau đây, mà trả về tất cả người sử dụng và 'bao gồm' tất cả các yêu cầu mẫu của họ:LINQ ".Include" orderby trong subquery

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
          orderby u.LastName ascending 
          select u; 

Mỗi người dùng có nhiều SampleRequests. Mỗi SampleRequest có một ID # (chỉ là một số nguyên: 1, 22, 341, v.v.). LINQ trên để tổ chức lấy người sử dụng và SampleRequests của họ như vậy:

User1: 33, 22, 341, 12

User2: 24, 3, 981

Như bạn có thể thấy SampleRequest ID # không theo thứ tự tăng dần. Tôi muốn kết quả theo thứ tự.

Làm thế nào để tôi đặt các hạn chế orderby trên bao gồm SampleRequests ID #

Xin lưu ý: SampleRequestId là một tài sản của SampleRequest ... không phải là một tài sản của đối tượng người dùng

+1

Đã xảy ra sự cố tương tự. Tìm thấy ... [http://stackoverflow.com/questions/1304556/linq-orderby-name-thenby-childrencollection-name](http://stackoverflow.com/questions/1304556/linq-orderby-name-thenby- childrencollection-name) – kervin

Trả lời

8

Tôi hiện có thể nghĩ đến hai tùy chọn cho những gì bạn muốn. Bạn có thể chọn chúng vào một lớp mới, trong đó người dùng và các yêu cầu liên quan là các thuộc tính:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
       orderby u.LastName ascending 
       select new 
       { 
        User = u, 
        SampleRequests = u.SampleRequests.OrderByDescending(r => r.SampleRequestId) 
       }; 

Điều này sẽ gây ra vấn đề nếu bạn muốn trả lại loại này, vì nó ẩn danh.

Bạn cũng có thể chọn này thành một đối tượng người dùng mới, tương tự như sau:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
       orderby u.LastName ascending 
       select new User 
       { 
        Property1 = u.Property1, 
        Property2 = u.Property2, 
        Property3 = u.Property3, 
        SampleRequests = u.SampleRequests.OrderByDescending(r => r.SampleRequestId).ToList() 
       }; 

này sẽ trả về một bộ sưu tập của các đối tượng dùng, nhưng việc cập nhật các đối tượng trong cơ sở dữ liệu có thể gây ra vấn đề.

+1

Nếu người dùng là một thực thể EF, bạn không thể gán kết quả của lệnh OrderByDescending(). ToList() của bạn (một List ) vào thuộc tính SampleRequests trên User, vì kiểu của nó sẽ là EntityCollection . Ngoài ra, tôi sẽ cảnh giác với việc gán từng thuộc tính trong truy vấn theo cách thủ công; nếu bạn thêm một thuộc tính mới cho Người dùng sau đó xuống theo dõi và quên cập nhật tất cả các truy vấn của mình, bạn sẽ nhận được các cá thể Người dùng mà không được gán thuộc tính đó. IMO nó có thể là một PITA bảo trì. –

+0

Tôi thấy điều này khá xấu xí nếu Lớp người dùng của bạn có nhiều thuộc tính. Điều này subcollection.ToList() làm cho rất nhiều chuyển giữa logic kinh doanh và sql-server? Một giải pháp có thể chỉ là lấy SampleRequests mà không có thứ tự và sau đó sắp xếp chúng sau này trong C# -code (= memory). –

+0

Bạn nên tạo một chỉ mục cơ sở dữ liệu được sắp xếp thành UserSet.LastName. Và một mẫu khác cho SampleRequests với (khóa ngoài đến UserSet và SampleRequestId) –

-1

Chỉ cần thêm tham số đặt hàng khác theo thứ tự:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
          orderby u.LastName ascending, 
            u.SampleRequestId descending 
          select u; 
+0

Cảm ơn, nhưng SampleRequestId là một thuộc tính của SampleRequests bao gồm, không phải của đối tượng User. –

+0

@ John: Đây là câu trả lời duy nhất tôi thấy cho những gì bạn mô tả. Tôi nghĩ chúng ta cần thêm thông tin trước. –

+0

OK tôi viết lại câu hỏi của tôi - tôi nghĩ rằng nó có thể là một chút rõ ràng hơn –

-2

Chỉnh sửa: Đã phát triển bởi < 15 giây.

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
       orderby u.LastName ascending, u.SampleRequestId descending 
       select u; 
+0

Cảm ơn, nhưng SampleRequestId là một tài sản của SampleRequests bao gồm, không phải của đối tượng người dùng. –