EF: перекрестный запрос linm-to -ites к edmx (та же БД)
Как я могу использовать два EDMX, в отдельных сборках, но выше той же базы данных,
создать запрос linq-to-entity, который использует их оба?
Например
Вот что я пытаюсь сделать:
using (var context1 = new Entities1())
{
using (var context2 = new Entities2())
{
var items2 = context2.Items.Where(item2 => item2.Color == "Red");
var query = context1.Items.Where(item =>
items2.Any(item2 => item2.PainterId == item.PainterId));
}
}
> Это приводит к NotSupportedException.
Сообщение: "Указанное выражение LINQ содержит ссылки на запросы, связанные с различными контекстами".
> Это исключение бросается, даже если Entities2 заменяется Entities1
(даже если оба контекста взяты из одного и того же EDMX) и оба используют одну и ту же строку подключения.
Для сравнения, с другой стороны, это работает и приводит к одному SQL-выражению:
using (var context1 = new Entities1())
{
var items2 = context2.Items.Where(item2 => item2.Color == "Red");
var query = context1.Items.Where(item =>
items2.Any(item2 => item2.PainterId == item.PainterId));
}
Ограничения:
Мое намерение состоит в том, чтобы использовать два EDMX с поддержкой дизайнера - без взлома EDMX таким образом, который нарушает работу дизайнера или перезаписывается при обновлении из базы данных.
EDMX # 1 может не знать о EDMX #2 (однако # 2 может знать о #1).
Я хочу, чтобы результат преобразовывался в один запрос SQL, а не считывал результаты из первой части в память, а затем возвращал их в базу данных в качестве входных данных для второй части запроса.
Связанные, но не то, что я ищу:
2 ответа
Вы ограничили свои требования так, как они отвечают на ваш вопрос: нет, это невозможно. Лучшее и единственное рекомендуемое решение находится во второй ссылке, которая ссылается на статью в блоге команды ADO.NET о работе с большими моделями.
Я написал о хаке (и я успешно использовал его в одном проекте), который также работает, но у него есть другой недостаток - вы должны использовать один контекст для обоих EDMX. Даже если это сработало, я не рекомендую использовать этот способ, потому что у него могут быть неисследованные недостатки, потому что он внутренне пропускает имя контейнера, которое используется во многих других местах в EF.
Другой хак, который работает, объединяет два EDMX в третий, а затем создает из него один ObjectContext, который обращается к обеим частям.
Все 3 EDMX должны будут использовать одно и то же пространство имен.
Слияние может быть выполнено программно, результатом слияния должны быть: файлы EDMX, SSDL, CSDL, MSL; EDMX для T4 и другие для встраивания в качестве ресурсов.
Любые объекты и ассоциации, которые находятся в обоих исходных EDMX, должны иметь одно и то же определение (концептуальное и картографическое).
Вы сможете запускать запросы в контексте объединенного EDMX, который выполняется для обоих исходных EDMX, объединяясь по идентификаторам или любым другим критериям.
Смотрите эту ссылку для получения дополнительной информации о подключении результатов:
Как я могу создать ObjectContext из отдельных файлов ssdl + csdl + msl и без edmx?