实体框架 - 填充子对象,过滤子对象

Bri*_*vey 5 c# linq entity-framework parent-child

我正在尝试优化一些代码,但我遇到了一些问题.我有一个数据库,有问题的表在EDMX中看起来像这样...... 在此输入图像描述

每个EmailQueue项目可以有多个EmailContact和EmailEntity记录,每个EmailContact可以有多个EmailSendFailures,但大多数都没有.

我想让每个EmailQueue中至少有一个EmailEntity记录,以及至少一个没有EmailSendFailure记录的EmailContact记录.*编辑:此外,我不想在此查询中包含这些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();
Run Code Online (Sandbox Code Playgroud)

问题是它然后返回System.Collections.Generic.List <{EmailQueue:Tesa.DataModels.EmailQueue,EmailContact:System.Collections.Generic.IEnumerable,EmailEntity:System.Collections.Generic.IEnumerable}>.我真的不想那样.我想要一个清单.

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

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();
Run Code Online (Sandbox Code Playgroud)

任何人都知道我在这里做错了什么?我怀疑它是在导航属性中的某个地方,由于我在"试错"(比试用更多的错误)阶段遇到的一些问题,在进入"我放弃,我发布到StackOverflow"阶段之前.

The*_*One 0

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

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