2011-12-29 31 views
6

Tôi có tập hợp số ID mà tôi muốn trả về một số đối tượng, tôi đang sử dụng câu lệnh linq với câu lệnh chứa:Linq Nơi chứa ... Giữ thứ tự mặc định

var recentCats = (from i in EntityCache.Default.GetAll<Categories>() 
          where WebProfile.Current.RecentlyCreatedCategories.Contains(i.Id) 
          && BoundCategory.ParentItemClass.Id.Equals(i.ParentItemClass.Id) 
          select new CategoryInfo() 
          { 
           Category = i, 
           ClassId = i.ParentItemClass.Id, 
           ClassImage = NamedResourceManager.GetResourceBinary(i.ParentItemClass.NameResourceId) 
          }); 

Điều này hoạt động hoàn toàn tốt, ngoại trừ việc tôi muốn giữ thứ tự các mục trong bộ sưu tập được trả về giống như trong danh sách đi vào. Ví dụ: nếu tôi có danh sách ID: 14, 603, 388, tôi muốn các đối tượng quay trở lại theo thứ tự như nhau, không phải thứ tự mà chúng được trả về bởi cache. Có cách nào trong khuôn khổ thực thể để làm điều này, hoặc bất kỳ cách nào để làm điều đó mà không liên quan đến tôi viết một vòng lặp foreach?

Cảm ơn

+0

Xin lỗi, không có thời gian cho câu trả lời đầy đủ, nhưng tôi có thể gợi ý cho bạn. Nó liên quan đến việc tham gia danh sách ID của bạn vào danh sách danh mục thay vì sử dụng 'where ... contains' – Ray

+0

Tôi nghĩ rằng vấn đề ở đây là, không có thứ tự cho SQL, trừ khi bạn đặt hàng một cách rõ ràng. SQL có thể trả về theo thứ tự bất kỳ, vì vậy không có thứ tự mặc định để giữ. – Euphoric

Trả lời

1

Đối với bất kỳ ai quan tâm, tôi đã có thể đưa chúng ra theo thứ tự như danh sách bằng cách tham gia cùng họ, như đã đề cập bởi Ray trong các nhận xét ở trên.

var recentCats = (from i in WebProfile.Current.RecentlyCreatedCategories 
           join b in allCats 
           on i equals b.Id 
           where BoundCategory.ParentItemClass.Id.Equals(b.ParentItemClass.Id) 
           select ... 

Cảm ơn một lần nữa vì sự giúp đỡ của bạn & câu trả lời.

3

Trường hợp Phần mở rộng LINQ như hầu hết các tiện ích mở rộng duy trì thứ tự ban đầu của danh sách.

Do LINQ's Enumerable Methods Maintain Relative Order of Elements?

Chừng nào bạn không rõ ràng sắp xếp lại hoặc sử dụng một nhà điều hành mà tự nhiên sẽ sắp xếp lại thứ tự danh sách ban đầu cần được duy trì. Rõ ràng sắp xếp lại danh sách cho một tuyên bố ở đâu sẽ là chi phí không cần thiết.


Lý do thông tin ở trên không áp dụng cho câu hỏi này trong phần nhận xét dưới đây. Tôi đề nghị thay đổi đầu ra của lựa chọn thành cặp khóa/giá trị, trong đó khóa là chỉ mục của Id trong danh sách của bạn và giá trị là đối tượng mới của bạn, sau đó orderBy khóa trên tập hợp kết quả và chọn giá trị.

+0

Đó là LINQ to Objects. Anh ấy đang sử dụng EF, sẽ trả về thứ tự từ SQL Server. – SLaks

+0

@SLaks cảm ơn bạn đã cung cấp thông tin, tôi đã chỉnh sửa câu trả lời của mình bằng một giải pháp khả thi. – Gent

+0

Cảm ơn lời giải thích và liên kết. Nó không hoàn toàn là những gì tôi đang tìm kiếm mặc dù, như tôi không nghĩ rằng tôi đã đủ cụ thể trong câu hỏi của tôi. Tại thời điểm này kết quả của tôi đang trở lại theo thứ tự họ đang ở trong bộ nhớ cache, vì đó là truy vấn tôi đang chạy - Tôi muốn họ theo thứ tự danh sách mà tôi đang kiểm tra thay thế. Tôi có thể làm điều đó bằng cách sử dụng một tham gia như đã đề cập bởi Ray ở trên thay vì mệnh đề contains. –

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