Abbiamo classiLINQ to entità - la ricerca in EntityCollection proprietà di navigazione
public Invoice: EntityObject
{
public EntityCollection<InvoicePosition> Positions { get {...}; set{...}; }
...
}
public InvoicePosition: EntityObject
{
public string GroupName { get {...}; set{...}; }
}
c'è dato IQueryable<Invoice>
, che non sono dati IQueryable<InvoicePosition>
. Come dovrei trovare fatture con posizioni, dove GroupName è 'Carburante'?
IQueryable<Invoice> invoices = InvoiceRepository.List();
IQueryable<Invoice> invoicesThatHaveFuelPositions =
from i in invoices
where ?
select i
EntityFramework deve essere in grado di tradurlo in una query sql corretta.
EDIT
Come ha scritto Mark Seemann, posso usare:
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;
c'è un problema. Quando utilizzo questo filtro, perdo "OtherInclude". Penso che questo non sia il modo corretto di filtrare quando si usa EF. Dovrò cambiarlo in:
IQueryable<Invoice> invoices = InvoiceRepository.List().Include("Positions").Include("OtherInclude");
IQueryable<Invoice> invoicesThatHaveFuelPositions = invoices.Where(???);
Ma cosa dovrei scrivere in Dove?
EDIT
cambiamento sono compresi ("Posizione") da includere ("Posizioni").
EDIT
Alex James ha dato link per la punta (http://blogs.msdn.com/alexj/archive/2009/06/02/tip-22-how-to-make-include-really-include.aspx), che suggerisce:
IQueryable<Invoice> invoicesThatHaveFuelPositions =
from i in invoices
where i.Positions.Any(p => p.GroupName == 'Fuel')
select i;
Sembra funzionare e non influenza EF comprende.
Grazie per questo suggerimento. Aggiungere Includi alla fine è problematico, perché utilizzo il pattern di repository e Include sono applicati per primi. La soluzione centrale (usando Any()) mi sta bene. – LukLed