1

2つのGUIDコレクションがあります。

List<Guid> statuses;
List<Guid> priorities;

次のクエリを作成する方法:

var result = context.Activity.Where(a => 
    (a.StatusID == statuses[0] || a.StatusID == statuses[1] || ... || a.StatusID == statuses[n]) &&
    (a.PriorityID == priorities[0] || a.PriorityID == priorities[1] || ... || a.PriorityID  == priorities[m]))

コレクションは空である可能性があり、この場合、適切な「AND」条件を追加しないでください。そのような動的クエリを実行するにはどうすればよいですか?

アップデート

うーん、私はこのようなものが必要だと想像してください:

List<Func<Activity, bool>> conds = new List<Func<Activity, bool>>();

var result = context.Activity.Where(conds[0] || (conds[1] && conds[2]))

どうやってするか?

4

3 に答える 3

5

質問に基づく最初の回答が含まれているオブジェクトと含まれているオブジェクト
のみを選択します。明らかに、コレクションが空の場合、どのオブジェクトも条件に一致しません。ActivityStatusIDstatussesPriorityIDprioritiesActivity

var result = context.Activity.Where(a => 
    statuses.Contains(a.StatusID) && priorities.Contains(a.PriorityID));

@DonTomatoのコメントに基づく代替回答質問
の作成方法に基づいて誤解があったに違いありません。ただし、必要に応じて条件を追加するのがいいと思いますIQueryable

List<Func<Activity, bool>> conditions = new List<Func<Activity, bool>>();
// add conditions to the list
// for eaxmple:
// conditions.add(a => statuses.Contains(a.StatusID));
// or 
// conditions.add(a => a.Name == "Don Tomato");

IQueryable query = context.Activity.AsQueryable();
foreach (Func<Activity, bool> condition in conditions)
   query = query.Where(condition);

List<Activity> result = query.ToList();
于 2012-11-29T15:13:17.370 に答える
0

このようにwhere句を連鎖させることができ、最終的にはそれらが一緒に結合されます。

var query = context.Activity.Where(o => <condition1>);

if (2ndconditionrequired)
{
    query = query.where(o => <condition2>);
}

query.ToList();
于 2012-11-29T15:14:35.933 に答える
0

次のようにすることもできます。

var result = context.Activity;

if (statuses != null && statuses.Count > 0)
{
    result = results.Where(a => 
        a.StatusID == statuses[0] || a.StatusID == statuses[1] || ... || a.StatusID == statuses[n];
}

if (priorities != null && priorities.Count > 0)
{
    result = results.Where(a => 
        a.PriorityID == priorities[0] || a.PriorityID == priorities[1] || ... || a.PriorityID  == priorities[m]);
}

result.ToList(); // The query won't be executed until here.

しかし、あなたが本当にやりたいことは、@Bazzzが答えたとおりだと思います。

于 2012-11-29T15:15:09.933 に答える