Tôi đã lên kế hoạch viết a tip về vấn đề này nhưng câu hỏi của bạn đã đánh tôi với cú đấm.
Giả sử một WorkItem
có nhiều WorkItemNotes
bạn có thể làm điều này:
var intermediary = (from item in ctx.WorkItems
from note in item.Notes
where note.SomeProp == SomeValue
select new {item, note}).AsEnumerable();
Điều này tạo ra một yếu tố mang tính chất cho mỗi WorkItemNote
phù hợp, và giữ tương ứng WorkItem
quá.
Độ phân giải danh tính EF đảm bảo rằng cùng một WorkItem
(theo tham chiếu) được trả lại nhiều lần nếu nó có nhiều WorkItemNotes
khớp với tiêu chí.
tôi cho rằng sau khi bạn muốn chỉ nhận được trở lại chỉ là WorkItems
, như thế này:
var workItems = intermediary.Select(x => x.item).Distinct().ToList();
Sau đó, nếu bây giờ bạn làm điều này:
foreach(var workItem in workItems)
{
Console.WriteLine(workItem.Notes.Count)
}
Bạn sẽ thấy rằng WorkItemNotes
phù hợp bộ lọc ban đầu đã được thêm vào bộ sưu tập Ghi chú của mỗi workItem
.
Điều này là do điều gì đó có tên là Mối quan hệ sửa chữa.
I.e. điều này mang lại cho bạn những gì bạn muốn có điều kiện bao gồm.
Hope this helps
Alex
Nguồn
2009-10-08 04:27:08
Thật sao? x.Item sẽ có WorkItemNotes thích hợp? Thật tuyệt vời! Tôi rất vui vì bạn đã đăng bài này bởi vì những gì tôi hiện có truy vấn db cho mỗi WorkItem. Cảm ơn! –
Một câu hỏi: Tại sao trung gian phải là IEnumerable? Nó có thể là IQueryable được không? –
Yeap công trình này. Bạn có thể sử dụng điều này cho các thủ thuật khác, chẳng hạn như sắp xếp, xem Mẹo 1 trong loạt mẹo của tôi! –