Значение cast для значения «Int32» не выполнено, поскольку материализованное значение равно null
У меня есть следующий код. Я получаю ошибку:
«Приведение типа значения« Int32 »не выполнено, потому что материализованное значение имеет значение null.
когда таблица CreditHistory не имеет записей.
- Тип узла выражения LINQ «ArrayIndex» не поддерживается в LINQ to Entities
- Linq to Entities, случайный порядок
- Linq int to string
- Entity Framework 4 / POCO - С чего начать?
- Тип одного из выражений в предложении соединения неверен в Entity Framework
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();
Как я могу изменить запрос для принятия нулевых значений?
- C # - код для заказа по свойству с использованием имени свойства в виде строки
- Как получить первую запись в каждой группе с помощью Linq
- linq для объектов не распознает метод
- «Лямбда-выражение с телом оператора не может быть преобразовано в дерево выражений»
- В LINQ для Entities поддерживаются только конструкторы и инициализаторы без параметров
- Объект или сложный тип '' не могут быть сконструированы в запросе LINQ to Entities
- Сравнение с регистром LINQ to Entities
- Как сделать массовую вставку - Linq для объектов
Запрос 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;