Ошибка, которую вы получаете из-за:
IEnumerable<EntityIdName> entitiesIDs =
(from a in afimDB.UNITES
select new EntityIdName { entityId = (int)a.UNIT_ID, entityName = a.UNIT_NAME })
.AsEnumerable();
AsEnumerable не полностью не выполняет выражение EF.Для этого вам нужно использовать ToList()
IEnumerable<EntityIdName> entitiesIDs =
(from a in afimDB.UNITES
select new EntityIdName { entityId = (int)a.UNIT_ID, entityName = a.UNIT_NAME })
.ToList();
Теперь у вас будет список POCO EntityIdName, на который можно ссылаться во втором выражении EF.EF выполнит этот второй запрос к контексту imDB, который не может быть включен в выражение из контекста afimDB.
Редактировать: Для демонстрации поведения и настройки.Это просто пример использования двух областей экземпляров DbContext, чтобы продемонстрировать, что запрос из одного контекста не может быть использован в другом.
using (var context2 = new TestDbContext())
{
var ids = context2.Customers
.Where(x => x.Name == "Fred")
.Select(x => x.CustomerId)
.AsEnumerable();
using (var context = new TestDbContext())
{
var customers = context.Customers.Where(x => ids.Contains(x.CustomerId))
.ToList();
}
}
Вышеприведенный сбой с исключением при извлечении клиентов с «Указанное выражение LINQ содержит ссылки на запросы, связанные с различными контекстами.»
using (var context2 = new TestDbContext())
{
var ids = context2.Customers
.Where(x => x.Name == "Fred")
.Select(x => x.CustomerId)
.ToList(); // <- The .ToList you need
using (var context = new TestDbContext())
{
var customers = context.Customers.Where(x => ids.Contains(x.CustomerId))
.ToList();
}
}
Работает, как ожидалось..ToList()
выполняет первый запрос к БД в список POCO, который является безопасным в рамках второго запроса..AsEnumerable()
нет.
Пожалуйста, оставляйте комментарии конструктивными и, возможно, попробуйте их перед повторным голосованием.