Могу ли я легко оценить множество IQueryables за один вызов базы данных с использованием Entity Framework? - PullRequest
1 голос
/ 16 января 2012

Предположим, у меня есть коллекция (произвольного размера) IQueryable<MyEntity> (все для одного типа MyEntity).Каждый отдельный запрос был успешно создан для инкапсуляции различных фрагментов бизнес-логики в форму, которая может быть оценена за одно обращение к базе данных.Есть ли способ, которым я теперь могу иметь все эти IQueryable s, выполненные за однократное прохождение в базу данных?

Например (упрощенно; мой фактическийзапросы более сложные!), если бы у меня было

ObjectContext context = ...;
var myQueries = new[] {
    context.Widgets.Where(w => w.Price > 500),
    context.Widgets.Where(w => w.Colour == 5),
    context.Widgets.Where(w => w.Supplier.Name.StartsWith("Foo"))
};

, я бы хотел, чтобы EF выполнял перевод каждого запроса (который он может выполнять индивидуально), затем за одно посещение базы данных выполните

SELECT * FROM Widget WHERE Price > 500
SELECT * FROM Widget WHERE Colour = 5
SELECT W.* FROM Widget 
                INNER JOIN SUpplier ON Widget.SupplierId = Supplier.Id 
           WHERE Supplier.Name LIKE 'Foo%'

, затем преобразуйте каждый набор результатов в IEnumerable<Widget>, обновив ObjectContext обычным способом.

Я видел различные сообщения о работе с несколькими наборами результатовиз хранимой процедуры , но это немного отличается (не в последнюю очередь потому, что я не знаю во время компиляции, сколько будет наборов результатов).Есть ли простой способ, или я должен использовать что-то вроде Поддерживает ли Entity Framework возможность иметь одну хранимую процедуру, которая возвращает несколько наборов результатов? ?

Ответы [ 2 ]

3 голосов
/ 16 января 2012

Нет.EF deos не имеет пакетирования запросов (будущие запросы).Один запрашиваемый - одна и та же база данных.В качестве обходного пути вы можете попробовать поиграть с ним и, например, использовать:

string sql = ((ObjectQuery<Widget>)context.Widgets.Where(...)).ToTraceString();

, чтобы получить SQL-запрос и создать собственную команду из всех SQL-запросов, которые должны быть выполнены.После этого вы можете использовать подход, аналогичный хранимым процедурам, для перевода результатов.

Если вам не нужно выполнять каждый запрос отдельно, вы также можете объединить их в один запрос:

context.Widgets.Where(...).Union(context.Widgets.Where(...));

Этоприведет к UNION.Если вам нужен UNION ALL, вы можете использовать метод Concat.

1 голос
/ 07 июня 2014

Ответ может быть запоздалым, надеюсь, он поможет кому-то еще с той же проблемой.

В NuGet есть расширенная библиотека Entity Framework, которая обеспечивает функцию будущих запросов (среди прочих). Я немного поиграл с этим, и это выглядит многообещающе.

Вы можете найти больше информации здесь .

...