Mamy zajęciaLINQ do podmiotów - w poszukiwaniu właściwości nawigacyjnych EntityCollection
public Invoice: EntityObject
{
public EntityCollection<InvoicePosition> Positions { get {...}; set{...}; }
...
}
public InvoicePosition: EntityObject
{
public string GroupName { get {...}; set{...}; }
}
Jesteśmy podane IQueryable<Invoice>
, nie podano IQueryable<InvoicePosition>
. Jak znaleźć faktury, które mają pozycje, gdzie GroupName to "Fuel"?
IQueryable<Invoice> invoices = InvoiceRepository.List();
IQueryable<Invoice> invoicesThatHaveFuelPositions =
from i in invoices
where ?
select i
EntityFramework powinien móc przełożyć je do właściwego zapytania SQL.
EDIT
Jak napisał Mark Seemann, mogę użyć:
IQueryable<Invoice> invoices = InvoiceRepository.List().Include("Positions").Include("OtherInclude");
IQueryable<Invoice> invoicesThatHaveFuelPositions =
from i in invoices
from p in i.Positions
where p.GroupName = 'Fuel'
select i;
Jest problem. Kiedy używam tego filtrowania, tracę "OtherInclude". Myślę, że nie jest to właściwy sposób filtrowania podczas używania EF. Będę musiał go zmienić na:
IQueryable<Invoice> invoices = InvoiceRepository.List().Include("Positions").Include("OtherInclude");
IQueryable<Invoice> invoicesThatHaveFuelPositions = invoices.Where(???);
Ale co mam pisać Gdzie?
EDIT
Zmieniono include ("Position"), które obejmują ("Pozycje").
EDIT
Alex James dał link do końcówki (http://blogs.msdn.com/alexj/archive/2009/06/02/tip-22-how-to-make-include-really-include.aspx), co sugeruje:
IQueryable<Invoice> invoicesThatHaveFuelPositions =
from i in invoices
where i.Positions.Any(p => p.GroupName == 'Fuel')
select i;
Wydaje się pracować i nie wpływa EF obejmuje.
Dzięki za tę wskazówkę. Dodanie opcji Uwzględnij na końcu jest problematyczne, ponieważ używam wzorca repozytorium, a uwzględnienia są stosowane jako pierwsze. Środkowe rozwiązanie (używając Any()) pasuje do mnie. – LukLed