Sto utilizzando Code First in EF. Diciamo che ho due entità:Filtraggio delle proprietà di navigazione in codice EF First
public class Farm
{
....
public virtual ICollection<Fruit> Fruits {get; set;}
}
public class Fruit
{
...
}
mio DbContext è qualcosa di simile:
public class MyDbContext : DbSet
{
....
private DbSet<Farm> FarmSet{get; set;}
public IQueryable<Farm> Farms
{
get
{
return (from farm in FarmSet where farm.owner == myowner select farm);
}
}
}
mi fare questo in modo che ogni utente può vedere solo le sue aziende agricole, e non ho chiamare la Dove su ogni query al db.
Ora, voglio filtrare tutti i frutti da una fattoria, ho provato questo (in classe Farm):
from fruit in Fruits where fruit .... select fruit
ma la query generata non include la clausola in cui, il che è molto importante perché Ho dozzine di migliaia di righe e non è efficiente caricarle tutte e filtrarle quando sono oggetti.
ho letto che pigri proprietà caricati si riempiono la prima volta che vengono raggiunti ma leggere tutti i dati, senza filtri possono essere applicati a meno che facciate qualcosa di simile:
from fruits in db.Fruits where fruit .... select fruit
ma non posso fallo, perché Farm non ha conoscenza di DbContext (non penso che dovrebbe (?)) ma anche a me perde solo l'intero scopo di usare le proprietà di navigazione se devo lavorare con tutti i dati e non solo con quello quello appartiene alla mia fattoria.
Quindi,
- sto facendo qualcosa di sbagliato/fare ipotesi sbagliate?
- Esiste un modo per applicare un filtro a una proprietà di navigazione che viene generata nella query reale? (Sto lavorando con molti dati)
Grazie per la lettura!
Grazie a Jeremy, ho deciso di seguire il tuo consiglio e lasciare le responsabilità di filtraggio/elaborazione nella mia classe di contesto . Ha senso perché ho bisogno solo del filtro per una delle mie entità, ma sarebbe ingombrante se ne avessi bisogno per diverse entità, non credi? Il contesto sarebbe popolato con metodi per interrogare e riempire entità. Non credo che rompa il principio di responsabilità singola, ma suona piuttosto strano, vero? – edpaez