2009-10-08 35 views
22

Tôi có hai bảng: bảng WorkItem và bảng WorkItemNote. Làm cách nào để trả về WorkItem và tất cả WorkItemNotes đáp ứng một tiêu chí nhất định?Truy vấn EF với điều kiện bao gồm

Tôi nghĩ điều này phải đơn giản, gần giống như "Bao gồm" có điều kiện, phải không?

Trả lời

38

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

+0

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! –

+0

Một câu hỏi: Tại sao trung gian phải là IEnumerable? Nó có thể là IQueryable được không? –

+0

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! –

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