LINQ - доступ к столбцу Int в дочерней таблице и обработка ситуации, когда нет дочерних строк - PullRequest
1 голос
/ 16 ноября 2010

Вот урезанная версия моего запроса linq;

 var list = from inv in db.Inventories
                       where inv.InventoryCode.StartsWith("005")
                       select
                       new
                       {
                           inv.InventoryCode,
                           inv.InventoryMedias.Where(im => im.MediaType == 0).FirstOrDefault().Synopsis,
                           inv.InventoryMedias.Where(im => im.MediaType == 0).FirstOrDefault().InventoryID
                       };

... поскольку запись инвентаризации не должна содержать строк в InventoryMedia, я добавил .FirstOrDefault (), который затем возвращает ноль, а linq достаточно умен, чтобы не выдавать ошибку ONSTIOO, но я получаю эта ошибка.

Ошибка приведения к типу значения 'Int32' потому что материализованная ценность ноль. Либо общий тип результата параметр или запрос должен использовать обнуляемый тип

Теперь я понимаю, что могу просто изменить анонимный тип на класс и определить это целое число как обнуляемый тип, но я не хочу этого делать. Я также пытался использовать команду if null "?? 0", но это не поддерживается на ссылочных типах, таких как int. Я знаю, что могу использовать .DefaultIfEmpty () и установить значение по умолчанию для анонимного типа, но как я могу установить значение по умолчанию для целого числа или есть другая альтернатива?

Ответы [ 2 ]

1 голос
/ 16 ноября 2010

Попробуйте сначала проецировать на нужные свойства, затем используйте FirstOrDefault(). Таким образом, вам не придется иметь дело с возможностью исключения нулевой ссылки, и тип будет таким, который подходит для свойства. При необходимости приведите к значению nullable.

var list = from inv in db.Inventories
           where inv.InventoryCode.StartsWith("005")
           select
           new
           {
               inv.InventoryCode,
               Synopsis = inv.InventoryMedias
                             .Where(im => im.MediaType == 0)
                             .Select(im => im.Synopsis)
                             .FirstOrDefault(),
               InventoryID = inv.InventoryMedias
                                .Where(im => im.MediaType == 0)
                                .Select(im => im.InventoryID)
                                .FirstOrDefault(),
           };
1 голос
/ 16 ноября 2010

приведение к обнуляемому int

int? value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...