2015-08-19 45 views
5

我试图优化一些代码,但我遇到了一些问题。我有一个数据库,有问题的表像这样在EDMX ... enter image description here实体框架 - 填充子对象,过滤子对象的孩子

每个EmailQueue项目可以有多个EmailContact和EmailEntity记录,每个EmailContact可以有多个EmailSendFailures,虽然大多数都会没有。

我希望每个EmailQueue至少有一个EmailEntity记录,并且至少有一个EmailContact记录没有EmailSendFailure记录。 *编辑:另外,我不想在这个查询中包含这些EmailContact记录。 *

经过一番StackOverflowing和一些试验和错误,我基本上能够达到沿着这些线路,此代码的东西:

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

与问题是,它并返回一个System.Collections.Generic。列表< {EmailQueue:Tesa.DataModels.EmailQueue,EmailContact:System.Collections.Generic.IEnumerable,EmailEntity:System.Collections.Generic.IEnumerable}>。我真的不想那样。我想要一个List。

这个我试过,这似乎像它应该工作,但我得到这个错误:

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

任何人有任何想法,我可能是错在这里做什么?由于我在“试错”阶段(比试验阶段更多的错误)阶段,在进入“我放弃,我发布到StackOverflow”阶段之前发生的一些问题,我怀疑它在导航属性中的某处。

回答

0

“我想每个EmailQueue其中至少有一个EmailEntity记录,以及至少一个EmailContact记录不具有EmailSendFailure记录”

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

我应该更具体。是的,这确实满足了我写的问题。问题是,我不想包含任何具有EmailSendFailure记录的EmailContact记录。在我的数据中,我有一个EmailQueue记录,其中有两个EmailContact记录,其中一个记录具有EmailSendFailure记录。这段代码返回两者。 –

+0

“这段代码返回两个(EmailContact)”,我不明白,这个查询返回EmailQueue的不是EmailContacts,这个使用Lazy加载,如果你导航到EmailQueue上的EmailContacts集合,Entity框架会执行一个新的对数据库的调用并将检索相关的EmailContacts – Tuco

2

先尝试,然后做所有的.includes 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")); }