【问题标题】:Lambda or LINQ for Complex Filter?用于复杂过滤器的 Lambda 或 LINQ?
【发布时间】:2014-07-06 22:47:32
【问题描述】:

我需要过滤大量对象(在内存中)以仅选择满足所有选定类别的对象。

这本质上是我希望复制的 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 表示不确定数量的用户选择的类别中的值。

【问题讨论】:

    标签: c# .net linq collections lambda


    【解决方案1】:

    让您的用户在列表中选择类别 ID,然后您可以使用 Contains。

    select distinct o.ObjectId
    from Object o
    join ObjectCategories oc on oc.ObjectId = o.ObjectId
    where yourCategoryList.Contains(oc=>oc.categoryID);
    

    【讨论】:

    • 如果存在,Contains() 方法将返回 true。我需要所有人都在场。
    【解决方案2】:
    var results = ObjectCategories.Where(t2 => ObjectList.Any(t1 => t2.Contains(t1)) == true)
    

    您可以计算匹配的数量,如果它等于您要检查的列表,则您拥有所有匹配项。

    【讨论】:

      【解决方案3】:

      考虑使用动态 LINQ。它允许您使用字符串表达式而不是 lambda 表达式。你应该能够使用类似的东西做你想做的事:

      var qry = ObjectCategories.Where( 
          "ObjectList.CategoryId.Contains(1) AND ObjectList.CategoryId.Contains(2) ..."
      );
      

      这里有一个相当可靠的动态 LINQ 实现:https://github.com/NArnott/System.Linq.Dynamic

      【讨论】:

        猜你喜欢
        • 2011-02-06
        • 1970-01-01
        • 1970-01-01
        • 2018-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-01
        相关资源
        最近更新 更多