Невозможно создать постоянное значение - только примитивные типы
Два простых запроса - исключение происходит в:
matchings.Any(u => product.ProductId == u.ProductId)
Что не так? Если я пишу true
, все это хорошо.
var matchings = (from match in db.matchings
where match.StoreId == StoreId
select match).ToList();
var names = (from product in db.Products
where matchings.Any(u => product.ProductId == u.ProductId)
select product).ToList();
Ответы
Ответ 1
Первый способ:
Удалите ToList()
в первом запросе.
или
//instead of retrieving mathings List, retrieve only the productIds you need (which are a List of Primitive types)
var productIdList = db.matchings
.Where(m => m.StoreId == StoreId)
.Select(x => x.ProductId)
.ToList();
var products = db.Products
.Where(p => productIdList
.Contains(p.ProductId))
.ToList();
или
//other way
var produts = db.Products
.Where(p => db.matchings
.Any(m => m.StoreId == StoreId &&
m.ProductId == p.ProductId)
)
.ToList();
Потому что я думаю, что вы в linq2entities, и вы используете список совпадений в запросе, который невозможен (название вашей темы, как правило, заставляет меня поверить в вашу проблему).
Ответ 2
Это выглядит как место для использования соединения
var query =
from product in db.Products
join matching in db.Matchings
on product.ProductId equals matching.ProductId into matchGroup
where matchGroup.Count() > 0 and matching.StoreId == StoreId
select product;
Ответ 3
Я столкнулся с такой же проблемой при написании следующего запроса с использованием таблиц коллекции и EF:
var result = (from listItem in list
join dbRecord in Context.MY_TABLE
on listItem.MyClass.ID equals dbRecord.ID
select new { dbRecord, listItem.SomeEnum }).ToList();
Я мог бы решить это с помощью изменения порядка источника в in
:
var result = (from dbRecord in Context.MY_TABLE
join listItem in list
on dbRecord.ID equals listItem.MyClass.ID
select new { dbRecord, listItem.SomeEnum }).ToList();
Ответ 4
Вы можете попробовать следующее. Он работал у меня как мой ProductId os типа nullable.
IQueryable<matchings> data = db.matchings.Any(u => product.ProductId.Value == u.ProductId);
или
IQueryable<matchings> data = db.matchings.Any(u => product.ProductId.Value.Equals(u.ProductId));
Это работало в моем случае, поскольку целевой идентификатор является типом NULL, поскольку он указывает на отношение 1: 0 → *.