0

検索には 3 ~ 4 つのオプションが必要です。今のところ、If ステートメントでクエリを使用しています。

     if inputcol1 > 0 And Not inputCol2 = "" then 
         Dim list = (From P In db.table
                     Where P.column1 = inputCol1 and P.column2 = inputCol2
                     Select P).ToList()
     end if

もう1つ(または4つ)別の条件がありますが、ほぼ同じクエリで、where句が1つだけ異なります。そのため、このクエリは単純化され、短くなります。したがって、非常に大きなクエリがある場合、それは大きな混乱になります。また、他のプログラマーに、いくつかのオプションのために多くのコードを読ませたくありません。

検索オプションが入力されているかどうかを確認してクエリを実行する適切な簡単な方法はありますか?

4

4 に答える 4

0

LinqKitを試してみてください。このライブラリをPredicateBuilder使用すると、メソッドを持つクラスがあります。

public static Expression<Func<T, bool>> True<T>();
public static Expression<Func<T, bool>> False<T>();
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2);
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2);

これらはExpression、ラムダから簡単に作成できるオブジェクトの拡張です。

そのような表現で、あなたはできるyourDataSource.Where(expression)

C# 表記ですみません、VB.net はわかりません... VB に直したいという方がいらっしゃいましたら、お気軽に。

編集:

まあ、PredicateBuilderちょうどきちんとした構文糖衣です。彼らのウェブサイトでは、本当にシンプルな完全なソース コードを見つけることができます。残念ながら、C#で。ここに行きます:

using System;
using System.Linq;
using System.Linq.Expressions;
using System.Collections.Generic;

public static class PredicateBuilder
{
  public static Expression<Func<T, bool>> True<T> ()  { return f => true;  }
  public static Expression<Func<T, bool>> False<T> () { return f => false; }

  public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,
                                                      Expression<Func<T, bool>> expr2)
  {
    var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
    return Expression.Lambda<Func<T, bool>>
          (Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
  }

  public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1,
                                                       Expression<Func<T, bool>> expr2)
  {
    var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
    return Expression.Lambda<Func<T, bool>>
          (Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters);
  }
}

以上です!式 (.net では標準であり、追加のライブラリは必要ありません) は、それらを操作するためのいくつかの優れた方法を提供し、where句内で使用できます。試してみる :)

于 2012-09-26T09:15:16.337 に答える
0

最良の方法は、クエリを条件付きで拡張することです。

Dim query = (From P In db.table Select P)

If inputCol1.HasValue
    query = (From P in query Where P.column1 = inputCol1 Select P)
End If
If inputCol2.HasValue
    query = (From P in query Where P.inputCol2 = inputCol2 Select P)
End If
' And so on...

Dim list = query.ToList()

を使用した条件付きフィルタリングはNot inputCol2.HasValue OrElse P.Value = inputCol2、役に立たない述語を含むクエリを作成します。クエリを条件付きで拡張することにより、重要な述語のみが組み込まれます。

于 2012-09-26T11:45:57.610 に答える
0

あなたはあなたのコードで正しい軌道に乗っていました..三項演算子の if ステートメントを変更するだけです:

    Dim table = New Dictionary(Of Integer, String)
    table.Add(1, "one")
    table.Add(2, "two")
    table.Add(3, "three")

    Dim inputCol1 As Integer
    Dim inputCol2 As String = "one"

    Dim list = (From P In table Where _
                (inputCol1 < 1 OrElse P.Key = inputCol1) _
                And (inputCol2 = "" OrElse P.Value = inputCol2) _
                Select P).ToList()

この質問に関するこの状況の詳細については、「条件付きフィルタリング」を参照してください。

于 2012-09-26T10:53:05.900 に答える