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表示不确定数量的用户选择类别中的值。

Lambda或LINQ用于复杂过滤器

让用户在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