2015-08-19 2 views
5

Ich versuche, etwas Code zu optimieren, aber ich habe ein kleines Problem damit. Ich habe eine Datenbank, und die Tabellen in Frage wie folgt aussehen in der EDMX ... enter image description hereEntity-Framework - untergeordnete Objekte füllen, filtern auf ein Kind des Kindes

Jeder EmailQueue Artikel mehrere eMail-Kontakt und EmailEntity Aufzeichnungen haben kann, und jeder eMail-Kontakt könnte mehrere EmailSendFailures haben, obwohl die meisten keine haben.

Ich möchte jede EmailQueue abrufen, in der mindestens ein EmailEntity-Datensatz und mindestens ein EmailContact-Datensatz vorhanden ist, der keinen EmailSendFailure-Datensatz enthält. * BEARBEITEN: Außerdem möchte ich diese EmailContact-Datensätze nicht in diese Abfrage aufnehmen.

*

Nach einiger StackOverflowing und einige Versuch und Irrtum, ich war im Grunde der Lage, etwas in dieser Richtung mit diesem Code zu erreichen:

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(); 

Das Problem mit diesem ist es dann ein System.Collections.Generic zurückgibt. Liste < {EmailQueue: Tesa.DataModels.EmailQueue, EmailContact: System.Collections.Generic.IEnumerable, EmailEntity: System.Collections.Generic.IEnumerable}>. Ich will das wirklich nicht. Ich möchte eine Liste.

Ich habe versucht, diese, die wie es scheint, sollte zu funktionieren, aber ich bekomme diese Fehlermeldung:

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(); 

Wer noch keine Ahnung, was ich hier falsch sein könnte tun? Mein Verdacht ist, dass es irgendwo in den Navigationseigenschaften ist, aufgrund einiger der Probleme, die ich während meiner Phase "Versuch und Irrtum" (mehr Fehler als Versuch) hatte, bevor ich in die Phase "Ich gebe auf, ich poste in StackOverflow" eintritt .

Antwort

0

„Ich möchte jeden EmailQueue bekommen, wo es mindestens einen EmailEntity Datensatz ist, und mindestens eine eMail-Kontakt-Datensatz, keine EmailSendFailure Datensatz hat“

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

Ich hätte genauer gesagt werden sollen. Ja, das erfüllt meine Frage, als ich sie schrieb. Das Problem ist, ich möchte keine der EmailContact-Datensätze enthalten, die einen EmailSendFailure-Datensatz haben. In meinen Daten habe ich einen EmailQueue-Eintrag, der zwei EmailContact-Einträge enthält, von denen einer einen EmailSendFailure-Eintrag enthält. Dieser Code gibt beide zurück. –

+0

"Dieser Code gibt beide zurück (EmailContact)", ich verstehe nicht, diese Abfrage gibt EmailQueue nicht EmailContacts zurück, diese verwendet Lazy loading. Wenn Sie zur EmailContacts-Auflistung in jeder EmailQueue navigieren, führt Entity Framework einen neuen Aufruf an die Datenbank durch und ruft die zugehörigen EmailContacts ab – Tuco

2

versuchen, alle .includes zuerst tun und dann Die Where-Klausel wie:

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")); } 
Verwandte Themen