2011-12-15 21 views
2

に述語を追加し、私は動的にこれらのフィルタを追加することができ、LINQの世界ではは動的Ado.NET世界でのLINQ

Void SomeMethod(bool flag) 
{ 
String Query = “ SELECT * FROM Products WHERE CategoryID = 125”; 
If (flag == true) 
    Query += “ AND Price > 25” 
.... 
} 

を、次のようなコードを持っているだろうか?

+1

http://www.albahari.com/nutshell/predicatebuilder.aspx –

答えて

5
if (someFlag) 
    query = query.Where(p => p.Price > 25); 
+0

このような場合、CateogryIDの意味でクエリには既に3つの結果が含まれています。 –

+0

いいえ実際に結果をフェッチするまでデータベースにヒットしません。 – Guillaume86

+2

いいえ、クエリ式は遅延です。クエリは、出力を生成するまで(つまり 'ToList()'を呼び出すことによって)実行されるまで実行されません。 –

7
var query = context.Products.Where(p => p.CategoryID == 125); 
if (flag) 
    query = query.Where(p => p.Price > 25); 
+0

p.CategoryID == 125 select p; 'Productsの中の' var query = from p 'のようなクエリ式で 'query'を初期化し、' Price'フィルタを適用することは可能です動的に –

+0

そして違いは何ですか? –

+0

コードの最初の行が@MagnusHoffの例のようになる点を除いて、違いはありません。 –

0
var data = from p in context.Products 
      where (flag == false && p.CategoryID == 125) 
       || (flag == true && p.CategoryID == 125 && p.Price > 25) 
      select p; 
0
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); 
    } 
3

あなたは、クエリの一部としてフラグをカンニングして使用することができます。

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です。試してみてはいけません:)