私はこのコードがうまく機能しなかったので、本当にリファクタリングする必要があります。これは、一連のクエリオブジェクト(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
例コードのリンクは、間違いなく感謝します。
私はここで、これらのメソッドの後ろにポイントを逃すだけですか? LINQの呼び出しを呼び出し側が連鎖させて、それを隠すために何かをオーバーエンジニアリングしようとするのではなく、呼び出し側が呼び出しやすくするほうが簡単でしょうか? –
フィールドはクライアントからのものです。クライアントは、JSONを前後に送信するWebブラウザです。私はクライアントから提供されたものを順番に調べて実装する必要があります。 –
JSONを.NETオブジェクトに逆シリアル化する(条件を呼び出す)ことができます。次に、よく知られている検索条件構造のエンティティクエリにLinqを組み込みますか? –