我试图优化一些代码,但我遇到了一些问题。我有一个数据库,有问题的表像这样在EDMX ... 实体框架 - 填充子对象,过滤子对象的孩子
每个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”阶段之前发生的一些问题,我怀疑它在导航属性中的某处。
我应该更具体。是的,这确实满足了我写的问题。问题是,我不想包含任何具有EmailSendFailure记录的EmailContact记录。在我的数据中,我有一个EmailQueue记录,其中有两个EmailContact记录,其中一个记录具有EmailSendFailure记录。这段代码返回两者。 –
“这段代码返回两个(EmailContact)”,我不明白,这个查询返回EmailQueue的不是EmailContacts,这个使用Lazy加载,如果你导航到EmailQueue上的EmailContacts集合,Entity框架会执行一个新的对数据库的调用并将检索相关的EmailContacts – Tuco