Вопрос по linq, c# – Невозможно создать постоянное значение - только примитивные типы

29

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

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();
Что за линк? -в-SQL? EF? NHibernate? CodesInChaos
NPE наmatchings может быть? Tudor
Что такое сообщение об исключении? Можете ли вы опубликовать все сообщение? Mark Byers

Ваш Ответ

4   ответа
7

 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;
@ agent-j: я что-то пропустил или нет?m.StoreId == StoreId отсутствует ?
+1: я впервые подумал оjoin а также - если вам не требуется промежуточноеmatchings по какой-то причинеjoin предпочтительнее ... один вызов в хранилище вместо двух.
@ Rapha & # xEB; lAlthaus, это ускользнуло от моего уведомления. Спасибо за указание на это.
3

ользованием таблиц collection и 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();

Я мог бы решить этоchanging the source order в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();
50

Удалить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, и вы используете список соответствий в запросе, который невозможен (название вашей темы заставляет меня верить, что это ваша проблема).

спасибо Рафаэль - все отлично работает, но не могли бы вы объяснить, почему у меня проблема с нулевой ссылкой - & gt; Должен ли я всегда делать двойной чек х == у & amp; у == х? Anton Putov
поэтому я положил его обратно. но первое объясните, может быть, лучше вашу проблему: вы пытались использовать List & lt; matchings & gt; (перечислено) в запросе linq2entities, что недопустимо. Возможно, вы даже можете повторить свой базовый код без ToList () в ваших & quot; var соответствиях & quot; запрос.
хм, я обновился, первая версия была в порядке для вас? На самом деле проблема, с которой вы столкнулись, не была проблемой NRE.
первый был в порядке Anton Putov
да, если первый запрос без метода ToList (), мои запросы тоже работают хорошо. Большое спасибо !!! Anton Putov
1

как мой 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.Equa,ls(u.ProductId));

В моем случае это сработало, так как целевой идентификатор имеет тип NULL, поскольку он указывает на 1: 0 - & gt; * отношения.

Похожие вопросы