Lambda或LINQ用于复杂过滤器
本文关键字:复杂 过滤器 用于 LINQ Lambda | 更新日期: 2023-09-27 18:04:03
我需要过滤大量对象(在内存中),只选择满足所有选定类别的对象。
这本质上是我想复制的SQL查询,但我一直无法想出一个好的c#替代方案:
select distinct o.ObjectId
from Object o
join ObjectCategories oc on oc.ObjectId = o.ObjectId
where oc.CategoryId in (1)
and oc.CategoryId in (2)
and oc.CategoryId in (3)
... and so on...
…其中,1、2、3表示不确定数量的用户选择类别中的值。
让用户在List中选择类别ID,然后可以使用Contains。
select distinct o.ObjectId
from Object o
join ObjectCategories oc on oc.ObjectId = o.ObjectId
where yourCategoryList.Contains(oc=>oc.categoryID);
var results = ObjectCategories.Where(t2 => ObjectList.Any(t1 => t2.Contains(t1)) == true)
你可以计算匹配的数量,如果它等于你要检查的列表,那么你有所有的匹配。
考虑使用动态LINQ。它允许您使用字符串表达式而不是lambda表达式。您应该能够使用类似于
的内容来做您想做的事情:var qry = ObjectCategories.Where(
"ObjectList.CategoryId.Contains(1) AND ObjectList.CategoryId.Contains(2) ..."
);
这里有一个非常可靠的动态LINQ实现:https://github.com/NArnott/System.Linq.Dynamic