Ошибка: "Указанное выражение LINQ содержит ссылки на запросы, связанные с различными контекстами"

Я получаю сообщение об ошибке, указанное в заголовке, из запроса LINQ, который включает две таблицы из двух разных файлов edmx. Вот запрос:

var query = (from a in db1.Table1
           join b in db1.Table2 on a.Id equals b.Id
           orderby a.Status
           where b.Id == 1 && a.Status == "new"
           select new
           {
               Id = a.Id,
               CompanyId = (from c in db2.Company
                            where s.Id == a.Id
                            select
                            new { c.CompanyId })
           });

db1 и db2 - это контексты, связанные с двумя разными файлами edmx. Как я могу преодолеть эту ошибку?

Ответ 1

Вам необходимо выполнить два запроса к базе данных:

var IDs =  (from a in db1.Table1 
            join b in db1.Table2 on a.Id equals b.Id 
            orderby a.Status 
            where b.Id == 1 && a.Status == "new" 
            select new a.Id).ToArray();

var query = from c in db2.Company
            join a in IDs on c.Id equals a.Id
            select new { Id = a.Id, CompanyId = c.CompanyId };

.ToArray() имеет решающее значение. Это предотвращает попытку EF выполнить комбинированный запрос (который будет терпеть неудачу, поскольку он использует два разных контекста). Вы можете использовать .AsEnumerable(), если вы предпочитаете хранить ленивую загрузку.


И ваш следующий вопрос:

Есть ли другой способ сделать запрос LINQ более оптимизированным? То есть, для выполнения действия в одном запросе LINQ?

Чтобы ваш исходный запрос был успешно запущен, он должен использовать только один контекст данных, что означает, что все данные должны быть доступны из одного EDMX, что, в свою очередь, означает одну строку соединения. Вы можете достичь нескольких способов:

  • Если обе таблицы находятся в одной базе данных, добавьте их в один EDMX.
  • Если они находятся в разных базах данных, но в том же экземпляре, создайте представление в одной из баз данных, которые выбирают из таблицы в другой базе данных, затем добавьте локальную таблицу и просмотрите один EDMX.
  • Если они находятся на разных экземплярах/серверах, создали связанный сервер, затем создайте представление таблицы на связанном сервере, затем добавьте локальную таблицу и просмотрите один EDMX.

Ответ 2

Вам либо нужно добавить вторую таблицу в модель первого контекста. Если это находится в нескольких базах данных, вам необходимо выполнить вторичный поиск на стороне клиента, используя объединение Linq to Objects.