【发布时间】:2019-05-13 15:04:15
【问题描述】:
我想对一组数据应用多个复合过滤器,如下所示:
Filter[] filters = new[] { new Filter { Name = "Bob", Gender = "Male" },
new Filter { Name = "Alice", Height = "Female" } };
_dbContext.People.Where(p => filter.Any(f => f.Name == p.Name && f.Gender == p.Gender)).Select(p => p.Id);
我对 Male Bobs 和 Female Alices 的 Ids 感兴趣。对不起女性鲍勃。我不要你。
这是在内存 Linq 中解决该问题的正确方法,但是 有问题。这就是 SQL EF 生成的样子(我正在我的 SQL Server Profiler 中检查)
SELECT [p].[Name], [p].[Gender], [p].[Id] FROM [People] AS [p]
这太可怕了。它挖掘所有内容,然后在内存中进行实际工作。这对很多人来说是不可能的,它会停止。
有没有办法让生成的sql看起来更像这样?
SELECT
[Person].[Id]
FROM [Person]
WHERE
((([Person].[Name] = "Bob") AND ([Person].[Gender] = "Male"))
OR (([Person].[Name] = "Alice") AND ([Person].[Gender] = "Female")))
(在Dapper 中是可能的)
【问题讨论】:
-
你可以试试predicate builder
-
嘿,是不是有错误,应该是_dbContext.People.Where(p => filter.Any(f => f.Name == p.Name && f.Gender == p.Gender)).Select(p => p.Id);