1

where 句に複数の値を含む LINQ クエリがあります。where句の値は、チェックボックスリストのフィルタリングオプションからのものです。Checkboxlist は Null (または例では空の文字列) を返すことができます。これは、checkboxlist で何も選択しないとすべてを選択することを意味するため、クエリに where 句が必要ないことを意味します。それを処理できる1つの優れたLINQを作成する方法がわからなかったため、以下のように複数のクエリで複数のIFステートメントを使用することになりました。私はそれをテストし、今のところwhere句に2つのパラメーターを使用して正常に動作します。しかし実際には、クエリに渡すにはさらに多くのパラメーターが必要であり、そのジョブを実行するために多くの IF ステートメントを使用すると面倒になります。1 つの適切な LINQ クエリでそれを処理するにはどうすればよいでしょうか?

Function FilterCol(ByVal col As List(Of ProductDetails), Optional SelectedCategory As List(Of String) = Nothing, Optional SelectedBrand As List(Of String) = Nothing) As List(Of ProductDetails)

    Dim strSelectedCategory  As String = String.Join(",", SelectedCategory .ToArray())
    Dim strSelectedBrand  As String = String.Join(",", SelectedBrand .ToArray())

    If strSelectedCategory  = "" And strSelectedBrand  = "" Then
        Return col
    ElseIf strSelectedCategory  = "" Then
        Dim res1 As IEnumerable(Of StatsDetails) = From x In col Where strSelectedBrand.Contains(x.Brand) Select x
        Return res1.ToList
    ElseIf strSelectedBrand  = "" Then
        Dim res2 As IEnumerable(Of StatsDetails) = From x In col Where strSelectedCategory.Contains(x.Category) Select x
        Return res2.ToList
    Else
        Dim res As IEnumerable(Of StatsDetails) = From x In col Where strSelectedCategory.Contains(x.Category) And strSelectedBrand.Contains(x.Brand) Select x
        Return res.ToList
    End If

End Function
4

3 に答える 3

0

これは、拡張メソッド構文を使用する方が簡単です。1 つの LINQ ステートメントとして実行するのは良い考えではないと思います。

できることは、最初にテーブルのみを使用して基本クエリを作成することです。私は C# でそれを行うつもりですが、VB に変換するのは複雑ではありません。あなたや私自身を混乱させたくありません!

var baseQuery = col;

ベース テーブルを取得したので、条件に基づいて where の追加を開始できます。

if(condition1 == true)
{
    baseQuery = baseQuery.Where(this is your where condition);
}

if(condition2 == true)
{
    baseQuery = baseQuery.Where(this is another condition);
}

したがって、 をWhere連結して、条件に基づいてクエリを絞り込むことができます。

最後に、クエリの結果をToList. これにより、条件で発生したコードの重複が回避され、すべてが理解しやすく維持しやすくなります。

于 2013-06-05T15:17:23.493 に答える
0

LINQ クエリに複数の可変条件がある場合は、Dynamic LINQ Libraryの使用を検討してください。提供されたパラメーターに基づいて条件を事前に文字列変数に結合し、その変数を LINQ クエリの条件として使用できます。これは、SQL Server の動的 SQL に似ています。

于 2013-06-05T14:34:59.947 に答える
0

次のようにラムダ exp を使用します。

Dim FnValueExists = 
      Function(v As String, a As List(Of String)) a Is Nothing OrElse 
                                                  a.Count = 0 OrElse 
                                                  a.Contains(v)

次に、linq で、以下のように値をテストします。

Dim res As IEnumerable(Of StatsDetails) = 
                    From x In col 
                    Where FnValueExists(x.Category, SelectedCategory) And 
                          FnValueExists(x.Brand, SelectedBrand)
                    Select x

x項目が選択されるかどうかを決定するメイン コードは、ラムダ式のそのa Is Nothing OrElse a.Count = 0 OrElse a.Contains(v)行です。FnValueExists

上記の場合、SelectedCategoryand/or SelectedBrandlist が Nothing または空 (Count=0) の場合、または値が含まれている場合、項目は引き続き選択されます。

したがって、ユーザーがカテゴリを選択しなかった場合は、空のリストを設定SelectedCategoryするNothingか、単に空のリストを設定できるため、FnValueExists(x.Category, SelectedCategory)常に true が返されます。

于 2013-06-06T10:58:02.230 に答える