2009-10-08 10 views
22

Mam dwie tabele: tabela WorkItem i tabela WorkItemNote. Jak mogę zwrócić WorkItem i wszystkie WorkItemNotes, które spełniają określone kryteria?EF kwerenda warunkowe Uwzględnij

Myślę, że to powinno być proste, prawie jak warunkowe "Uwzględnij", prawda?

Odpowiedz

38

Mam zamiar napisać na ten temat a tip, ale twoje pytanie pokonało mnie.

Zakładając WorkItem ma wiele WorkItemNotes

można to zrobić:

var intermediary = (from item in ctx.WorkItems 
       from note in item.Notes 
       where note.SomeProp == SomeValue 
       select new {item, note}).AsEnumerable(); 

To daje anonimowego elementu dla każdego WorkItemNote który pasuje, i posiada odpowiednie WorkItem też.

Funkcja identyfikacji tożsamości EF zapewnia, że ​​ten sam numer WorkItem (przez odniesienie) jest zwracany wiele razy, jeśli ma wiele wartości WorkItemNotes spełniających kryteria.

Zakładam, że w przyszłym chcesz po prostu wrócić do tylko WorkItems coś takiego:

var workItems = intermediary.Select(x => x.item).Distinct().ToList(); 

Następnie jeśli teraz zrobić:

foreach(var workItem in workItems) 
{ 
    Console.WriteLine(workItem.Notes.Count) 
} 

Zobaczysz, że WorkItemNotes pasujących oryginalny filtr został dodany do kolekcji Notes każdego z workItem.

Dzieje się tak z powodu czegoś, co nazywa się Fixup Relationship.

tj. to daje ci to, co chcesz, warunkowe.

Nadzieja to pomaga

Alex

+0

Naprawdę? x.Item będzie mieć odpowiednie WorkItemNotes? To cudownie! Cieszę się, że opublikowałeś to, ponieważ to, co obecnie mam zapytania do db dla każdego WorkItem. Dzięki! –

+0

Jedno pytanie: dlaczego pośrednik musi być niezliczony? Czy to może być IQueryable? –

+0

Yeap to działa. Możesz użyć tego do innych trików, takich jak sortowanie, zobacz Tip 1 z mojej serii porad! –