Значение cast для значения «Int32» не выполнено, поскольку материализованное значение равно null

У меня есть следующий код. Я получаю ошибку:

«Приведение типа значения« Int32 »не выполнено, потому что материализованное значение имеет значение null.

когда таблица CreditHistory не имеет записей.

var creditsSum = (from u in context.User join ch in context.CreditHistory on u.ID equals ch.UserID where u.ID == userID select ch.Amount).Sum(); 

Как я могу изменить запрос для принятия нулевых значений?

Запрос linq-to-sql не выполняется как код, а скорее переведен в SQL. Иногда это «непроницаемая абстракция», которая приводит к неожиданному поведению.

Одним из таких случаев является обработка нуля, где могут быть неожиданные нули в разных местах. ...DefaultIfEmpty(0).Sum(0) может помочь в этом (довольно простом) случае, когда не может быть элементов, а SUM sql возвращает null тогда как c # ожидает 0.

Более общий подход – использовать ?? который будет переведен в COALESCE всякий раз, когда существует риск того, что сгенерированный SQL возвращает неожиданный null:

 var creditsSum = (from u in context.User join ch in context.CreditHistory on u.ID equals ch.UserID where u.ID == userID select (int?)ch.Amount).Sum() ?? 0; 

Это первый отбрасывает int? чтобы сообщить компилятору C #, что это выражение действительно может вернуть значение null , хотя Sum() возвращает int . Тогда мы используем нормальный ?? оператора для обработки null случая.

Основываясь на этом ответе, я написал сообщение в блоге с подробностями как для LINQ to SQL, так и для LINQ для Entities.

Чтобы разрешить нулевое поле Amount , просто используйте оператор null coalescing для преобразования значений null в 0.

 var creditsSum = (from u in context.User join ch in context.CreditHistory on u.ID equals ch.UserID where u.ID == userID select ch.Amount ?? 0).Sum(); 

Вы используете функцию aggregate которая не позволяет элементам выполнять действие, вы должны проверить, что запрос linq дает следующий результат:

 var maxOrderLevel =sdv.Any()? sdv.Max(s => s.nOrderLevel):0 

Это сообщение об ошибке, когда я пытался выбрать из представления.

Проблема заключалась в том, что в последнее время появилось несколько новых нулевых строк (в столбце SubscriberId), и оно не было обновлено в EDMX (сначала в базе данных EF).

Столбец должен был быть Nullable, чтобы он работал.

var dealer = Context.Dealers.Where (x => x.dealerCode == dealerCode) .FirstOrDefault ();

Перед обновлением просмотров:

 public int SubscriberId { get; set; } 

После просмотра обновления:

 public Nullable SubscriberId { get; set; } 

Удалено и добавлено представление в EDMX.

Надеюсь, это поможет кому-то.

Я использую этот код, и он отвечает правильно, только выходное значение имеет значение NULL.

 var packesCount = await botContext.Sales.Where(s => s.CustomerId == cust.CustomerId && s.Validated) .SumAsync(s => (int?)s.PackesCount); if(packesCount != null) { // your code } else { // your code } 

Я вижу, что на этот вопрос уже дан ответ. Но если вы хотите, чтобы он был разделен на два утверждения, можно рассмотреть следующее.

 var credits = from u in context.User join ch in context.CreditHistory on u.ID equals ch.UserID where u.ID == userID select ch; var creditSum= credits.Sum(x => (int?)x.Amount) ?? 0; 

Получил эту ошибку в Entity Framework 6 с этим кодом во время выполнения:

 var fileEventsSum = db.ImportInformations.Sum(x => x.FileEvents) 

Обновление от LeandroSoares:

Используйте это для однократного выполнения:

 var fileEventsSum = db.ImportInformations.Sum(x => (int?)x.FileEvents) ?? 0 

Оригинал:

Изменен, и тогда это сработало:

 var fileEventsSum = db.ImportInformations.Any() ? db.ImportInformations.Sum(x => x.FileEvents) : 0; 
  • Зачем использовать LINQ Join для простого отношения «один-много»?
  • Указанный член типа не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, сущности и свойства навигации сущности
  • Получить функцию результата в LINQ без перевода для сохранения выражения
  • ASP.NET MVC 2.0 Реализация поиска в jqgrid
  • Преобразование String в Int в EF 4.0
  • Linq to Entities соединяются с groupjoin
  • Entity Framework: запрос дочерних объектов
  • В чем разница между .ToList (), .AsEnumerable (), AsQueryable ()?
  • Возможна ли инъекция через динамический LINQ?
  • LEFT JOIN в LINQ для объектов?
  • LINQ to Entities не распознает метод
  • Interesting Posts

    Как проверить соответствие даты в Java

    Создание видео с изображений с различными SAR с помощью FFMPEG

    Могу ли я приобрести обновление для Windows 8 и установить его на другой компьютер?

    Могу ли я исправить ошибку 0xc0000225 без переустановки Windows?

    Изменить текст и действие кнопки – разработка Android-приложений

    Эмулятор Visual studio (2015) для android не работает – XDE.exe – Код выхода 3

    Создание PDF с закладками из Microsoft Word в Mac OS X

    Использование Java для поиска подстроки большей строки с использованием регулярного выражения

    Заполнение вкладки имени файла Bash

    Роль антистатической обертки для запястий, применение термического раствора, очистка при проливании и другие необходимые меры предосторожности, защита вашей материнской платы

    Удалить настройку из стиля, чтобы наследовать настройку из базового стиля

    Есть ли способ, которым пользователь может просматривать или копировать не редактируемые элементы управления GUI во время выполнения?

    Почему эти горуты не масштабируют свою работу от более одновременных казней?

    андроидный диалог прозрачный

    Как сделать Bash моей оболочкой по умолчанию на Ubuntu?

    Давайте будем гением компьютера.