データベースからデータを返すクエリを作成しています。フィルタリングしたいIDのリストを渡しています。フィルター リストが null または空の場合、すべてのものを返したいと思います。
これを可能にする拡張メソッドがあります。これ
query
は、IQueryable
nullIds
許容 int のリストです (聞かないでください!)ListHasElements
は、リストが null ではなく、何かが含まれている場合に true を返すメソッドです。
var filteredList = query.WhereIf(ListHasElements(Ids), s => Ids.Contains(s.Id.Value));
ただし、ビルドするときquery
は、好みのクエリ構文を使用します
var query = from a in dbContext.as
join b in dbContext.bs on a.Id.ToString() equals b.Id
join cin dbContext.cs on b.Id equals c.Id into bcJoin
from items in bcJoin.DefaultIfEmpty()
where b.Sent >= fromDate
where b.Sent <= toDate
select new{a=a.thing, b=b.thingy, q=items.q,Id=a.Id}
次に、魔法の WhereIf フィルターを実行するために最初の行を挿入する必要があります。最後に、さらにグループ化して出力オブジェクトを作成することを選択します (コードは示されていません!)
拡張方法はこんな感じ。
public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition,
Expression<Func<TSource, bool>> predicate)
{
return condition ? source.Where(predicate) : source;
}
このメソッドをクエリ構文クエリで直接使用できますか?