实体框架中的过滤器包括

时间:2019-09-15 08:14:16

标签: c# entity-framework-6

我需要包含子表的记录,并根据条件Status='Completed'进行过滤。我尝试了所有可能的方式,例如Any()IncludeFilter(),但我无法实现所需的功能。我浏览了与此查询相关的所有帖子,但没有解决方案。

return await db.Jobs
               .Where(x => x.Account == id && 
                           x.Status == "Completed")
              .Include(x => x.Account1)
              .Include(x => x.Bids.Select(s => s.Account1))
              .ToListAsync();

我可以过滤主表Jobs,但是我还需要过滤子表Bids。简而言之-我需要状态为Completed的出价完成的工作。

1 个答案:

答案 0 :(得分:0)

Include不会过滤,它仅包含将要加载的相关数据以及所选的主要实体。

要获得帐户状态已完成且至少具有一个出价已完成的出价的职位:

db.Jobs.Where(x => x.Account == id 
    && x.Status == "Completed"
    && x.Bids.Any(b => b.Status == "Completed"))
    .Include(x => x.Account1)
    .ThenInclude(b => b.Account1)
    .ToListAsync();

当人们返回实体时,使他们绊倒的典型事情是他们会说“但我只想退回已完成的投标”。这将返回已完成且至少具有1个已完成出价的工作的所有出价。

要将已过滤的一组相关数据返回给那些作业,请使用ViewModels / DTO返回视图/ API使用者,而不是返回实体。实体作业将反映数据状态。一个工作可能包含很多出价,因此实体应反映该工作的完整数据状态。

要以完成的投标返回完成的工作,请为工作,投标等定义POCO视图模型类,然后使用.Select()将实体投影到视图模型中:

var viewModels = db.Jobs
    .Where(x => x.Account == id 
    && x.Status == "Completed"
    && x.Bids.Any(b => b.Status == "Completed"))
    .Select(x => new JobViewModel
    {
       AccountId = x.Account,
       Account = x.Account1.Select(a => new AccountViewModel 
       { 
           AccountId = a.Id,
           // ...
       },
       Bids = x.Bids.Where(b => b.Status == "Completed)
           .Select(b => new BidViewModel 
           {
               BidId = b.Id,
               // ...
           }).ToList()
    }).ToListAsync();