に述語を追加し、私は動的にこれらのフィルタを追加することができ、LINQの世界ではは動的Ado.NET世界でのLINQ
Void SomeMethod(bool flag)
{
String Query = “ SELECT * FROM Products WHERE CategoryID = 125”;
If (flag == true)
Query += “ AND Price > 25”
....
}
を、次のようなコードを持っているだろうか?
に述語を追加し、私は動的にこれらのフィルタを追加することができ、LINQの世界ではは動的Ado.NET世界でのLINQ
Void SomeMethod(bool flag)
{
String Query = “ SELECT * FROM Products WHERE CategoryID = 125”;
If (flag == true)
Query += “ AND Price > 25”
....
}
を、次のようなコードを持っているだろうか?
if (someFlag)
query = query.Where(p => p.Price > 25);
このような場合、CateogryIDの意味でクエリには既に3つの結果が含まれています。 –
いいえ実際に結果をフェッチするまでデータベースにヒットしません。 – Guillaume86
いいえ、クエリ式は遅延です。クエリは、出力を生成するまで(つまり 'ToList()'を呼び出すことによって)実行されるまで実行されません。 –
var query = context.Products.Where(p => p.CategoryID == 125);
if (flag)
query = query.Where(p => p.Price > 25);
p.CategoryID == 125 select p; 'Productsの中の' var query = from p 'のようなクエリ式で 'query'を初期化し、' Price'フィルタを適用することは可能です動的に –
そして違いは何ですか? –
コードの最初の行が@MagnusHoffの例のようになる点を除いて、違いはありません。 –
var data = from p in context.Products
where (flag == false && p.CategoryID == 125)
|| (flag == true && p.CategoryID == 125 && p.Price > 25)
select p;
private void GetData(bool flag)
{
var query = from p in db.products
where p.CategoryId == 125
select p;
if(flag)
query = query.Where(o => o.Price > 25);
}
あなたは、クエリの一部としてフラグをカンニングして使用することができます。
var query = from p in Products
where p.CategoryID == 125
&& (!flag || p.Price > 25)
select p
;
あなたはに余分な基準を渡すならSLaksとWiktor第Zychlaが述べたように、あなただけの、列挙にそれらを適用し、新しい列挙を得ることができます。あなたがオブジェクトに代わりのLINQのエンティティへのLINQでこれを行う場合、これは同様に動作しない場合があります、またはあなたが少なくとも返却する必要がありますことを
IEnumerable<Product> GetProducts(params Func<Product, bool>[] criteria)
{
var query = Products.Where(p => p.CategoryID == 125);
foreach(criterion in criteria)
{
query = query.Where(criterion);
}
return query;
}
// ...
var notFiltered = someObject.GetProducts().ToList();
var filtered = someObject
.GetProducts(
p => p.Price > 25,
p => p.AverageReviewScore > 4
)
.ToList();
注:ToList
を呼び出すまでクエリが解決されませんIEnumerable
の代わりにIQueryable
です。試してみてはいけません:)
http://www.albahari.com/nutshell/predicatebuilder.aspx –