3

私は LINQ を (mvc で) 使用して最初のプロジェクトに取り組んでいるので、見逃した非常に単純なものがあると思われます。ただし、検索と実験の 1 日を行っても、機能するものは何も見つからなかったため、投稿します。

OR または AND で区切られた where ステートメントに複数の条件を含む LINQ クエリ (Linq to SQL) を作成しようとしています。実行時まで、クエリに含まれる条件の数はわかりません。これは、ユーザーが複数の基準を選択してフィルター処理できる検索フィルター コントロール用です。

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

すべての条件をループしながら、SQL クエリを文字列として構築する前に。ただし、LINQ でこれを行う良い方法があるはずです。式ツリーを使用して調べてみましたが、今のところ頭の中にあるようです。もう 1 つのアイデアは、次のように where ステートメント内でラムダ関数を実行することでした。

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

ただし、これは AND 条件でのみ機能します。OR を行うにはどうすればよいですか?

4

3 に答える 3

2

これにはPredicateBuilderを使用します。これにより、動的な WHERE 句が非常に簡単になります。

于 2010-02-03T18:09:00.117 に答える
1

AND簡単です -Whereループで呼び出すだけです。ORはるかにトリッキーです。あなたはSQLに言及しているので、これはLINQ-to-SQLのようなものだと思います。その場合、これを行うために私が見つけた1つの方法はExpression、実行時にカスタムツリーを構築することです-そのように(例はC#ですが、教えてください) VB に翻訳するのに助けが必要な場合; 私の VB はもはや素晴らしいものではないので、最初に試してもらいます...おそらく、私が VB を書くよりも C# を読むほうがよいでしょう)。

残念ながら、これは3.5SP1 の EF では機能しませんExpression.Invoke( .

于 2010-02-03T18:00:50.073 に答える
0

このようなものが機能するはずです(私の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は少し錆びています:-)

ただし、 sやsだけでなく、より複雑な処理を実行する場合は、PredicateBuilderの方が優れたソリューションになる可能性があります。AndOr

于 2010-02-03T18:12:55.607 に答える