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?

Другие вопросы по тегам