0

私はこのコードがうまく機能しなかったので、本当にリファクタリングする必要があります。これは、一連のクエリオブジェクト(productid = 3のような文字列)を受け取り、それらをクエリに追加します。これは論理積に対してのみ機能しますが、最終的にはいくつかの論理演算子(OR、NOT)が必要になります。Entity Framework 4とLinq to Entitiesの仕様:どのようにコード化するのですか?

-- Idea here is add the where clause to the original query and return a new one 
private static IQueryable<Product> GetFilteredQuery(string condition, 
    IQueryable<Product> originalQuery) 
    { 
     -- REPETITION 
     if(-- Regex comparison looking for "productid = 123" --) 
     { 
      returnQuery = originalQuery.Where(
        p => p.myEntity.SelectMany(q => q.subEntity) // spec expression 
          .Any(r => r.id == foundid));   
     } 
     ... (one if statement for each specification, calling this several times) 

私はまた、注文のためにこれを持っている:

private static IQueryable<Product> GetOrderedQuery(IList<string> fields, 
    IQueryable<Product> originalQuery) 
{ 
    var resultQuery = originalQuery; 
    bool firstTime = true; 
    foreach(var field in fields) 
    { 
     -- REPETITION 
     if(field == "id") 
     { if(firstTime == true) 
      { resultQuery = resultQuery.OrderBy(p => p.id); 
       firstTime = false; 
      } 
      else 
      { resultQuery = resultQuery.ThenBy(p => p.id); 
      } 
     } 
     ... (one for each field to order by) 
    } 

は、どのように私は順序を含め、私は何とか私の元のクエリに仕様のこのコレクションを添付することができます仕様オブジェクトへの各反復をカプセル化することができ表現?これはLinq to Entities、Entity Framework 4、およびC#の傘の下にあります。

このようなことをするのは本当にうれしいですが、これは本質的に上記のことです。

var originalQuery = ...; 
foreach(var spec in mySpecs) 
{ originalQuery = spec(originalQuery); //adds all the where clauses 
} 

originalQuery = orderSpec(originalQuery); // adds all the order fields 

例コードのリンクは、間違いなく感謝します。

+0

私はここで、これらのメソッドの後ろにポイントを逃すだけですか? LINQの呼び出しを呼び出し側が連鎖させて、それを隠すために何かをオーバーエンジニアリングしようとするのではなく、呼び出し側が呼び出しやすくするほうが簡単でしょうか? –

+0

フィールドはクライアントからのものです。クライアントは、JSONを前後に送信するWebブラウザです。私はクライアントから提供されたものを順番に調べて実装する必要があります。 –

+0

JSONを.NETオブジェクトに逆シリアル化する(条件を呼び出す)ことができます。次に、よく知られている検索条件構造のエンティティクエリにLinqを組み込みますか? –

答えて

1

私は似たようなのを見た唯一のものは、このでした:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

しかし、実体SQLにクエリを変換しないのはなぜそれがEF 4に固有のものではないのか?

あなたは文字列としてクエリを作成し、そのSQLクエリにこれらの用語を追加することができます。

HTH。

+0

ダイナミックSQLの問題は、厳密に型指定されていないことだけです。仕様パターンは強く型付けされ、ラムダ式を使用して参加を示す。 p => p.name –

+0

動的SQLでは、キャストを使用して適切な型にキャストできます。 Entity SQLは機能します。 –

1

LinqSpecsをご覧ください。あなたが必要とするものを行うか、少なくとも作業に役立つアイディアを与えてください。

私はあなたのような何かを行うことができるかもしれない理解して何から:

var originalSpec = ...; 
var composedSpec = originalSpec; 

foreach(var spec in mySpecs) 
{  
    composedSpec &&= spec; //adds all the where clauses 
} 

composedSpec &&= orderSpec; // adds all the order fields