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

时间:2015-08-19 19:41:12

标签: c# linq entity-framework parent-child

我正在尝试优化某些代码,但我遇到了一些问题。我有一个数据库,有问题的表在EDMX中看起来像这样...... enter image description here

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

问题在于它返回System.Collections.Generic.List< {EmailQueue:Tesa.DataModels.EmailQueue,EmailContact:System.Collections.Generic.IEnumerable,EmailEntity:System.Collections.Generic.IEnumerable}&gt ;。我真的不想要那个。我想要一个清单。

我尝试了这个,看起来应该可行,但我收到了这个错误:

  

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

任何人都知道我在这里做错了什么?我怀疑它是在导航属性中的某个地方,因为我在我的&#34;试验和错误期间遇到的一些问题&#34; (更多错误而不是试用)阶段,在进入&#34之前;我放弃,我发布到StackOverflow&#34;相。

2 个答案:

答案 0 :(得分: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")); }

答案 1 :(得分:0)

&#34;我想让每个EmailQueue至少有一个EmailEntity记录,并且至少有一个没有EmailSendFailure记录的EmailContact记录&#34;

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