我正在使用实体框架并构建一个 linq 查询,以便在数据库中执行查询以最小化返回的数据,并且查询可以有一些可选的搜索条件和一些每次都完成的排序。我正在与父母和孩子(妈妈和爸爸类型)一起工作。我试图实现的过滤器是针对孩子的年龄的。
所以,如果我有一些这样的数据......
parent 1
- child[0].Age = 5
- child[1].Age = 10
parent 2
- child[0].Age = 7
- child[1].Age = 23
...并且我指定最小年龄为 8 岁,我想要显示的结果是...
parent 1
- child[1].Age = 10
parent 2
- child[1].Age = 23
...如果我指定最低年龄为 15 岁,我打算展示...
parent 2
- child[1].Age = 23
我可以用这个可怕的查询重新创建我的预期结果(我假设它实际上做了不止一个查询):
var parents = context.Parents;
if(minimumChildAge.HasValue)
{
parents = parents.Where(parent => parent.Children.Any(child => child.Age >= minimumChildAge.Value));
foreach(var parent in parents)
{
parent.Children = parent.Children.Where(child => child.minimumChildAge.Value >= mimumumChildAge);
}
}
parents = parents.OrderBy(x => x.ParentId).Take(50);
所以我尝试了另一种方法......
var query = from parent in context.Parents
select parent;
if (minimumChildAge.HasValue)
query = from parent in query
join child in context.Children
on parent.ParentId equals child.ParentId
where child.Age >= minimumChildAge.Value
select parent;
query = query.OrderBy(x => x.ParentId).Take(50);
当我在 linqpad 中运行它时,生成的查询看起来不错。所以我的问题...
这是这样做的正确方法吗?有没有更好的办法?如果我现在指定一个最大年龄,我将编写相同的连接并希望实体框架能够解决这个问题,这似乎有点有趣。此外,这对延迟加载有何影响?我希望只返回符合条件的孩子。那么,当我这样做时parent.Children
,实体框架是否知道它只是查询了这些并在过滤集合上工作?