2009-03-24 4 views
3

Я ищу инструмент, который будет динамически генерировать запросы Linq to Entity от данного объекта, Query By Entity (Example), если хотите. Если для объекта и контекста объекта он принадлежит, генератор возвращает ObectQuery или IQueryable, которые могут быть дополнительно изменены или выполнены. В идеале, построитель запросов не будет напрямую ссылаться на Entity Model, скорее, он будет использовать контекст объекта для построения запроса из модели. Я полагаю, код ищет что-то вроде этого:Query By Entity (Пример)

 QueryBuilder qb = new QueryBuilder(new EntitiesContext()); 
     Customer c = new Customer(); 
     qb.Add(c); 
     c.FirstName = "Jim"; 
     var qry = qb.BuildQuery(); 
     int total = qry.Count(); 

Основной запрос будет выглядеть примерно так:

var query = from c in ctx.Customers 
      where c.FirstName == "Jim" 
      select c; 

уже существует такая вещь, где-нибудь? Я могу себе представить что-то вроде этого, но я предпочел бы начать использовать то, что уже существует.

ответ

1

Я действительно не вижу значения в QueryBuilder. Если это так просто, как в вашем примере, вы можете использовать его только для поиска точных совпадений. Если вам нужны более сложные запросы, вам, вероятно, будет лучше использовать Linq напрямую.

Вы знаете, что можете связать свои запросы? Это, вероятно, не совсем то, что вы ищете, но вы могли бы сделать

IQueryable<Customers> source=context.Customers; 

if (...) 
{ 
    source = from c in source 
      where c.FirstName.StartsWith("Jim") 
      select c; 
} 

if (...) 
{ 
    source = from c in source 
      where contries.Contains(c.Country) 
      select c; 
} 

// ... 
1

Вы можете использовать динамический Linq для создания ваших выражений Linq во время выполнения - просто добавление методов к существующему запросу Linq (прежде чем выполнить его). Сказав это, понятие класса «QueryBuilder», как сказал Крис, вызывает сомнительную заслугу.

Строго говоря, Linq сам является построителем запросов, так как он принимает оператор Linq и создает «график», который поставщик запросов затем может использовать для выполнения основной работы (компиляция инструкции SQL для Linq-To- SQL или перечисление объектов Linq-For-Objects). Если вы хотите предложить конечным пользователям возможность динамически строить запросы, подумайте о создании пользовательского интерфейса, который создает инструкцию Linq, добавив методы запросов, такие как Крис. Помните, что с помощью запроса Linq вы можете добавить столько выражений, сколько хотите - запрос выполняется только при смене счетчика.

т.е. Для выбора старейшего клиента под 65 имени Джим:

Dim qry = From customer in DataContext.Customers 
qry = qry.Where(Function (c as Customer) c.Name="Jim") 
qry = qry.Where(Function (c as Customer) c.Age < 65) 
qry = qry.OrderByDescending(Function (c as Customer) c.Age) 
qry = qry.Take(1) 
Dim oldJim as Customer = qry.FirstOrDefault() 

Метода FirstOrDefault, как с помощью ToArray или For Each, поездки перечислителя и, таким образом, обрабатывает запрос.

Надеюсь, это поможет!