Невозможно создать постоянное значение - только примитивные типы

Два простых запроса - исключение происходит в:

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 → *.