【问题标题】:dynamically varied number of conditions in the 'where' statement using LINQ使用 LINQ 在“where”语句中动态改变条件数量
【发布时间】:2011-01-12 17:37:44
【问题描述】:

我正在使用 LINQ(在 mvc 中)进行我的第一个项目,所以我可能错过了一些非常简单的东西。然而,经过一天的搜索和试验,没有发现任何可行的方法,因此发布了这篇文章。

我正在尝试编写一个 LINQ 查询(Linq to SQL),该查询将在 where 语句中包含多个条件,由 OR 或 AND 分隔。直到运行时,我们才知道查询中有多少条件。这是一个搜索过滤器控件,用户可以在其中选择多个条件进行过滤。

select * from table
where table.col = 1 
    OR table.col = 2
    OR table.col = 7
    .... 'number of other conditions

之前我只是将 SQL 查询构造为一个字符串,同时遍历所有条件。但是,在 LINQ 中似乎应该有一个很好的方法来做到这一点。 我曾尝试使用表达式树进行查找,但目前它们似乎有点超出我的想象。另一个想法是在 where 语句中执行一个 lambda 函数,如下所示:

For Each value In values
    matchingRows = matchingRows.Where(Function(row) row.col = value)

但是,这仅适用于 AND 条件。我该如何做手术室?

【问题讨论】:

    标签: sql vb.net linq where-clause


    【解决方案1】:

    AND 很简单——你可以循环调用WhereOR 要复杂得多。你提到了 SQL,所以我假设这类似于 LINQ-to-SQL,在这种情况下,我发现这样做的一种方法是在运行时构建自定义 Expression 树 - like so(示例是 C#,但如果您需要帮助将其翻译成 VB,请告诉我;我的 VB 不再出色,所以我会让您先尝试...您可能会比我写 VB 更好地阅读 C#)。

    不幸的是,这不适用于 3.5SP1 中的 EF(由于 Expression.Invoke),但我相信这已在 4.0 中修复。

    【讨论】:

      【解决方案2】:

      我会为此使用PredicateBuilder。它使动态 WHERE 子句变得非常容易。

      【讨论】:

        【解决方案3】:

        这样的东西应该可以工作(原谅我的 VB):

        Expression(Of Func(Of Something, Boolean)) filter = Nothing
        ParameterExpression rowParam = Expression.Parameter("row", CType(Something))
        
        For Each value In values
            filterPart = Expression.Equal( _
                Expression.Property(rowParam, "col"), _
                Expression.Constant(value)))
            If filter Is Nothing Then
                filter = filterPart 
            Else
                filter = Expression.OrElse(filter, filterPart)
            End If
        Next
        
        If newPredicate IsNot Nothing Then
            matchingRows = matchingRows.Where( _
                Expression.Lambda(Of Func(Of SomeType, Boolean))(filter, rowParam))
        End If
        

        不保证,但是,我的 VB 有点生疏 :-)

        但如果您想做比Ands 和Ors 更复杂的事情,PredicateBuilder 可能是一个更好的解决方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-02
          • 1970-01-01
          • 1970-01-01
          • 2013-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多