2009-03-24 3 views
3

私は、エンティティからのエンティティクエリ、エンティティからのクエリを動的に生成するツール(例)を探しています。エンティティとそれが属するオブジェクトコンテキストが与えられると、ジェネレータはさらに変更または実行できるObectQueryまたはIQueryableを返します。理想的には、クエリビルダはエンティティモデルを直接参照するのではなく、オブジェクトコンテキストを使用してモデルからクエリを構築するのが理想的です。私はこのようなコードを見なものを想像:エンティティによるクエリ(例)

 QueryBuilder qb = new QueryBuilder(new EntitiesContext()); 
     Customer c = new Customer(); 
     qb.Add(c); 
     c.FirstName = "Jim"; 
     var qry = qb.BuildQuery(); 
     int total = qry.Count(); 

根本的なクエリは、このようなものになります。

var query = from c in ctx.Customers 
      where c.FirstName == "Jim" 
      select c; 

がすでにどこかに存在し、そのようなことをしましたか?私はこのようなコーディングを想像することができますが、すでに存在するものを使い始めることになります。

答えて

1

私は本当にQueryBuilderの値が表示されません。あなたのサンプルと同じくらいシンプルであれば、それを使って正確なマッチを見つけることができます。より複雑なクエリが必要な場合は、おそらくLinqを直接使用する方がよいでしょう。

クエリを連鎖できることはご存じでしょうか?それはあなたが探しているまさにおそらくではありませんが、あなたは

IQueryable<Customers> source=context.Customers; 

if (...) 
{ 
    source = from c in source 
      where c.FirstName.StartsWith("Jim") 
      select c; 
} 

if (...) 
{ 
    source = from c in source 
      where contries.Contains(c.Country) 
      select c; 
} 

// ... 
1

を行うことができますが、実行時に、あなたのLINQの式を構築するために、動的LINQを使用することができます - 単純に(あなたがそれを実行する前に)既存のLINQクエリにメソッドを追加します。 これは言いましたが、 "QueryBuilder"クラスの概念は、Chrisが述べたように、疑わしいメリットがあります。

厳密に言えば、LinqはLinqステートメントを受け取り、クエリプロバイダが基礎となる作業を行うために使用できる「グラフ」を構築するため、Linq-To- SQL、またはLinq-For-Objectsのオブジェクトを列挙すること)。 エンドユーザーにクエリを動的に作成する機能を提供する場合は、Chrisのようにクエリメソッドを追加してLinqステートメントを作成するUIを作成することを検討してください。 Linqクエリでは、好きなだけ多くの式を追加できます。クエリは、列挙子がトリップされたときにのみ実行されます。

すなわちジムという名前の65の下で最も古い顧客を選択するには:

Dim qry = From customer in DataContext.Customers 
qry = qry.Where(Function (c as Customer) c.Name="Jim") 
qry = qry.Where(Function (c as Customer) c.Age < 65) 
qry = qry.OrderByDescending(Function (c as Customer) c.Age) 
qry = qry.Take(1) 
Dim oldJim as Customer = qry.FirstOrDefault() 

FirstOrDefault方法は、たToArrayを使用してのように、または各については、列挙子をトリップため、クエリを処理します。

希望すると便利です。

関連する問題