2015-08-19 13 views
5

Sto cercando di ottimizzare un po 'di codice, ma ho un po' di problemi con esso. Ho un database, e le tabelle in questione simile a questa nel EDMX ... enter image description hereFramework Entity - popolamento di oggetti figlio, filtro su un figlio di child

Ogni elemento EmailQueue può avere più record contatto del email e EmailEntity, e ogni contatto del email potuto avere più EmailSendFailures, anche se la maggior parte avrà nessuno.

Desidero ottenere ogni EmailQueue in cui è presente almeno un record di EmailEntity e almeno un record di EmailContact che non ha un record di EmailSendFailure. * EDIT: Inoltre, non voglio includere quei record EmailContact in questa query. *

Dopo qualche StackOverflowing e alcuni tentativi ed errori, sono stato praticamente in grado di realizzare qualcosa in questo senso con questo codice:

var emails2 = 
    (from eqs in 
     this.context.EmailQueues 
     .Include(q => q.EmailContacts) 
     .Include(e => e.EmailEntities) 
    where eqs.EmailContacts.Count > 0 
    && eqs.EmailEntities.Count > 0 
    && eqs.SentFlag == false 
    select new 
    { 
     EmailQueue = eqs, 
     EmailContact = eqs.EmailContacts.Where(c => !c.EmailSendFailures.Any()), 
     EmailEntity = eqs.EmailEntities 
    }).ToList(); 

Il problema è che poi restituisce uno System.Collections.Generic. Elenco < {EmailQueue: Tesa.DataModels.EmailQueue, EmailContact: System.Collections.Generic.IEnumerable, EmailEntity: System.Collections.Generic.IEnumerable}>. Io davvero non lo voglio. Voglio una lista.

ho provato questo, che sembra che dovrebbe funzionare, ma ottengo questo errore:

The Include path expression must refer to a navigation property defined on the type. Use dotted paths for reference navigation properties and the Select operator for collection navigation properties.

List<EmailQueue> emails1 = 
    this.context.EmailQueues.Include(q => q.EmailContacts.Where(c => !c.EmailSendFailures.Any())) 
     .Include(e => e.EmailEntities) 
     .Where(eqs => eqs.EmailContacts.Count > 0 && eqs.EmailEntities.Count > 0 && eqs.SentFlag == false) 
     .ToList(); 

Qualcuno ha idea di quello che potrebbe essere sbagliato qui? Il mio sospetto è che si trovi da qualche parte nelle proprietà di navigazione, a causa di alcuni dei problemi che ho avuto durante la fase di "prova ed errore" (più errore che prova), prima di entrare nella fase "Mi arrendo, sto postando per StackOverflow" .

risposta

0

"Voglio ottenere ogni EmailQueue in cui v'è almeno un record EmailEntity, e almeno un record contatto del email che non ha un record EmailSendFailure"

List<EmailQueue> result = context.EmailQueues.Where(e=>e.EmailEntities.Any() && 
e.EmailContacts.Any(ec=>!ec.EmailSendFailures.Any())).ToList(); 
+0

Avrei dovuto essere più specifico. Sì, soddisfa la mia domanda mentre la scrivevo. Il problema è che non voglio includere alcuno dei record EmailContact che hanno un record EmailSendFailure. Nei miei dati, ho un record EmailQueue con due record EmailContact, uno dei quali ha un record EmailSendFailure. Questo codice restituisce entrambi. –

+0

"Questo codice restituisce entrambi (EmailContact)", non capisco, questa query restituisce EmailQueue non EmailContacts, utilizza il caricamento Lazy, se si accede alla raccolta EmailContacts su ogni EmailQueue, il framework Entity eseguirà una nuova chiamata al database e recupererà i relativi EmailContacts – Tuco

2

Prova a fare tutte le .includes e poi la clausola where:

context.Subjects.Include(r => r.RelatedSubjects).Include(t => t.Organisations).Include(y => y.Organisations.Select(i => i.Directories)) 
      .Where(y => y.Organisations.Any(e => e.Status == "Live")); }