3

実行時にwhere句を作成する必要がありますが、where句とORを実行する必要があります。これは可能ですか..説明させてください..

ここで私のコード...、基本的に「フィルター」はビット単位の列挙型であるため、フィルターは次の1つ以上に等しくなる可能性があります。したがって、where句を作成する必要があります...

最初にUntestedを実行した場合とは異なり、wheresを個別に実行すると、0レコードが返されます。これは、現在0レコードであるため、Testedでwhereを実行できないことを意味します。

以下にいくつかの疑似コードを配置します:-)

        string myWhere = "";

        if ((filter & Filters.Tested) == Filters.Tested)
        {
             if (myWhere != "" ) myWhere =myWhere + "||";
             myWhere = myWhere " Status == "Tested";

        }

        if ((filter & Filters.Untested) == Filters.Untested)
        {
             if (myWhere != "" ) myWhere =myWhere + "||";
             myWhere = myWhere " Status == "Untested";
        }

        if ((filter & Filters.Failed) == Filters.Failed)
        {
             if (myWhere != "" ) myWhere =myWhere + "||";
             myWhere = myWhere " Status == "Failed";
        }

        // dataApplications = a List of items that include Tested,Failed and Untested.

        // dataApplciation.Where ( myWhere) ---  Confused here!  

これは可能ですか。

たくさんの組み合わせがあるので、たくさんの「IF」を含めたくありません。つまり、フィルターなし、filter =テスト済みのみ、filter =未テスト、テスト済み...などです。

どんなアイデアも本当にありがたい

ありがとう

4

3 に答える 3

4

あなたがこれを持っているなら:

IEnumerable<MyType> res = from p in myquery select p;

あなたは定義することができます

var conditions = new List<Func<MyType, bool>>();

conditions.Add(p => p.PropertyOne == 1);
conditions.Add(p => p.PropertyTwo == 2);

res = res.Where(p => conditions.Any(q => q(p)));

そして今、匿名オブジェクトの機能のリストを作成するためのトリック(そしてあなたはそれを匿名オブジェクトのタイプを「抽出」するために簡単に変更することができます)

static List<Func<T, bool>> MakeList<T>(IEnumerable<T> elements)
{
    return new List<Func<T, bool>>();
}

LINQクエリの結果を渡すことで呼び出します。それで

var res = from p in elements select new { Id = p.Id, Val = p.Value };
var conditions = MakeList(res);
于 2011-02-20T11:13:44.443 に答える
3
var statusTexts = new List<string>(); // Add desired status texts
dataApplication.Where(item =>
        statusTexts.Any(status => item.Status == status))
于 2011-02-20T11:19:34.193 に答える
0

ステータスにHashSet<>を使用する.Containsと、List <>の通常のO(n)ではなくO(1)になります。

var statuses = new HashSet<string>() {"a", "b", "c"};
var list = new[] {
    new {   Id = 1, status = "a"},
    new {   Id = 2, status = "b"},
    new {   Id = 3, status = "z"}
};

var filtered = list.Where(l => statuses.Contains(s => l.status == s));
于 2015-06-25T07:57:57.820 に答える