Entity Framework 4 и спецификации Linq to Entities: как его кодировать? - PullRequest
0 голосов
/ 19 ноября 2010

Я выбросил этот код, потому что он работал, но мне действительно нужно сделать рефакторинг для чего-то приемлемого. Он принимает набор объектов запроса (строки, которые выглядят как productid = 3), а затем добавляет их в мой запрос. Это работает только для логического И, но в конечном итоге мне понадобятся несколько различных логических операторов (ИЛИ, НЕ).

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

Ссылки на веб-сайты, пример кода, несомненно, будут оценены.

Ответы [ 2 ]

1 голос
/ 12 февраля 2012

Посмотрите на 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
1 голос
/ 19 ноября 2010

Единственное, что я увидел, было что-то похожее:

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

Но это не относится к EF 4. Почему бы не преобразовать запрос в объектный SQL?

Вы можете создать запрос в виде строки и добавить эти термины к этому запросу SQL.

НТН.

...