0

Я выбросил этот код, потому что он работал, но мне действительно нужно реорганизовать что-то приемлемое. Он принимает набор объектов запроса (строки, которые выглядят как productid = 3), затем добавляет их в мой запрос. Это работает только для логического И, но в конечном итоге мне понадобится несколько разных логических операторов (ИЛИ, НЕ).Спецификации 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 туда и обратно. Мне нужно будет перебирать все предоставленные от клиента и реализовывать их. –

+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

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

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

HTH.

+0

Только проблема с Dynamic SQL не сильно типизирована. Шаблон Спецификации будет строго типизирован, используя выражения Лямбды, чтобы указать на участие. p => p.name –

+0

С динамическим SQL, я согласен, вы можете использовать Cast для приведения в соответствующий тип. 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 

 Смежные вопросы

  • Нет связанных вопросов^_^