实体框架 - 填充子对象,筛选子级的子级

5
我正在尝试优化一些代码,但是我遇到了一些问题。我有一个数据库,EDMX中的表如下所示... enter image description here 每个EmailQueue项可以有多个EmailContact和EmailEntity记录,每个EmailContact可能有多个EmailSendFailures,但大多数情况下没有。
我想获取每个至少有一个EmailEntity记录和至少有一个没有EmailSendFailure记录的EmailContact记录的EmailQueue。*编辑:此查询中不包括这些EmailContact记录。*
经过一些StackOverflow和试错,我基本上使用以下代码实现了类似的功能:
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.List<{EmailQueue:Tesa.DataModels.EmailQueue, EmailContact:System.Collections.Generic.IEnumerable, EmailEntity:System.Collections.Generic.IEnumerable}>。我真的不想要那个。我想要一个List。

我尝试了这个,看起来应该可以工作,但是我得到了这个错误:

Include路径表达式必须引用类型上定义的导航属性。对于引用导航属性,请使用点路径,对于集合导航属性,请使用Select运算符。

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”阶段之前。

2个回答

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

0

我想获取每个EmailQueue,其中至少有一条EmailEntity记录,并且至少有一条EmailContact记录没有一个EmailSendFailure记录

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

我应该更具体一些。是的,按照我写的方式回答满足我的问题。问题是,我不想包含任何有EmailSendFailure记录的EmailContact记录。在我的数据中,我有一个EmailQueue记录,其中包括两个EmailContact记录,其中一个有一个EmailSendFailure记录。这段代码会返回这两个记录。 - Brian Davey
这段代码返回了两个(EmailContact),我不明白,这个查询返回的是EmailQueue而不是EmailContacts,它使用了延迟加载,如果你在每个EmailQueue上导航到EmailContacts集合,Entity Framework会执行一个新的数据库调用,并检索相关的EmailContacts。 - The One

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接