0

このコードは機能したので破棄しましたが、受け入れられるものにリファクタリングする必要があります。一連のクエリ オブジェクト (productid = 3 のような文字列) を受け取り、それらをクエリに追加します。これは論理 AND に対してのみ機能しますが、最終的にはいくつかの異なる論理演算子 (OR、NOT) が必要になります。

-- 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

ウェブサイトへのリンク、サンプルコードは、きっとありがたいです。

4

2 に答える 2

1

私が似たようなものを見たのはこれだけでした:

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

しかし、それはEF 4に固有のものではありません。クエリをエンティティSQLに変換してみませんか?

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

HTH。

于 2010-11-19T14:49:48.563 に答える
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
于 2012-02-12T16:03:13.357 に答える