2016-03-10 18 views
5

Supponiamo che io ho due tabelle seguentiAggiungere dove clausola istruzione include per oggetto Queryable

  • Un
  • B
  • C

A, B e C tabelle hanno un valore booleano " IsEnabled "colonna.

c'è 1 a molti relazione tra le tabelle come segue:

  • A-> B
  • B-> C

Sto usando Entity Framework per interrogare il tavolo e il la programmazione è in C#. Supponiamo, ho bisogno di tutte le colonne di A, faccio la seguente:

var query = _context.A; query.where(<where clause>)

Se ho bisogno di includere le colonne di B per prevenire lazy loading,

query.Include (s => s.B); 

La domanda è: come posso includere le colonne di B aggiungendo una clausola where per selezionare solo le righe che hanno IsEnabled = 1? Cerco qualcosa di simile:

query.Include (s => s.B.where (k => k.IsEnabled = 1)) (Questo non funziona e genera un'eccezione runtime)

Se siamo in grado di ottenere la domanda di cui sopra, voglio includere le colonne di C anche di righe che è IsEnabled = 1 per entrambi B e C. È possibile?

risposta

1

Includi è usato per caricare avidamente le relazioni, ma purtroppo Entity Framework non supporta il filtraggio di queste raccolte lato server, con caricamento pigro o avido.

Hai due opzioni: fai filtraggio sul lato client o riorganizza le query per utilizzarle in modo più efficiente (ad es. Se sei dopo C, seleziona C.Where(c => c.IsEnabled && c.B.IsEnabled && c.B.A.IsEnabled)).

0

Supponiamo di avere un'entità simile a questo

public class A 
{ 
    public int Id {get;set;} 
    public ICollection<B> Bs {get;set;} 
} 

public class B 
{ 
    public bool IsEnabled {get;set;} 
} 

Così, quando si fa la query in quanto si ha la ICollection al Bs dovrebbe funzionare senza errori di runtime.