我需要包含子表的记录,并根据条件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
的出价完成的工作。
答案 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();