繁体   English   中英

使用实体框架过滤相关实体

[英]Filtering Related Entites with Entity Framework

根据这个StackOverflow答案:

Linq to Entities-如何在子实体上进行过滤

您应该能够通过使用投影来过滤Entity Framework中的相关实体列表,就像我在这里所做的那样:

Company company = _context.Company
.Where(g => g.CompanyId == id)
.Select(comp => new
{
    group = comp,
    operators = comp.Operator,
    formFamilies = comp.FormFamily.Where(ff => ff.IsActive ?? false)
}).AsEnumerable().Select(i => i.group).FirstOrDefault();

为了快速概述我要在此处获取的内容,我试图获取与此公司对象关联的所有活动表单系列的列表,但是,无论何时以任何方式限制结果,都必须使用结果集是空的。

  • 如果该行是formFamilies = comp.FormFamily则它将返回两个结果,一个处于活动状态,一个处于非活动状态
  • 如果该行是formFamilies = comp.FormFamily.Where(ff => true)则不返回任何内容
  • 如果该行是formFamilies = comp.FormFamily.OrderBy(ff => ff.FormFamilyId)则不返回任何内容。

我对comp.FormFamily所做的任何修改都意味着结果集不返回任何内容,我已经深入研究了SA的最深部分以尝试找到解决方案,并尝试了我找到的每个解决方案,但似乎没有什么原因列表返回任何东西。

假设Company和FormFamily实体之间存在一对多的关系,我建议使用join语句。这样的事情应该可以为您提供所需的东西。

  var company =  from c in _context.Company
                           join f in _context.FormFamily
                           on c.Id equals f.CompanyId   
                           where c.Id == id
                           select new Company()
                           {
                               Id = c.Id,
                               operators = c.Operator.ToList(),
                               formFamilies = c.FormFamily.Where(x=>x.IsActive == 
                                               false).ToList()
                           } .FirstOrDefault();

希望这可以帮助。

我不太了解您的查询应该做什么。 但是在我看来,您不能仅在另一个Select结果方法上调用Select方法。

无论如何,您可以简单地使用Include方法而不是进行投影。

var company = _context.Company
    .Where(c => c.Id == id)
    .Include(c => c.FormFamily).Where(ff => ff.IsActive ?? false)
    .ToList();

没有测试。 为了证明它是否可行,请确保在问题中放入一个实体模型。 然后,我可能会得出更准确的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM