Запрос по сущности (пример) - PullRequest
3 голосов
/ 24 марта 2009

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

        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;

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

Ответы [ 3 ]

2 голосов
/ 25 марта 2009

Я не совсем уверен, каковы ваши цели, если вы опубликуете больше информации о вашем контексте (фактическая проблема), но Dynamic Linq может помочь вам динамически создавать запросы linq:

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

Wiebe

1 голос
/ 25 марта 2009

Вы можете использовать динамический 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, отключает перечислитель и обрабатывает запрос.

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

1 голос
/ 25 марта 2009

Я не вижу значения в 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;
}

// ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...