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

时间:2018-11-12 05:15:52

标签: c# asp.net entity-framework linq-to-entities

根据此StackOverflow答案:

Linq to Entities - how to filter on child 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的最深层以尝试找到解决方案,并尝试了所找到的每个解决方案,但是似乎没有什么可导致此列表返回任何内容。

2 个答案:

答案 0 :(得分:0)

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

希望这会有所帮助。

答案 1 :(得分:0)

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

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

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

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