У меня была такая же проблема, и я пробовал все, что было опубликовано здесь, чтобы исправить это, но никто не работал для меня. В моем случае я использую Cygwin для компиляции dll. Кажется, что JVM пытается найти JRE DLL на виртуальном пути Cygwin. Я добавил путь виртуального каталога Cygwin к DLL JRE, и теперь он работает. Я сделал что-то вроде:
SET PATH = "/ cygdrive / c / Program Files / Java / jdk1.8.0_45";% PATH%
blockquote>
Запрос linq-to-sql не выполняется как код, а скорее переведен в SQL. Иногда это «непроницаемая абстракция», которая приводит к неожиданному поведению.
Одним из таких случаев является обработка с нулевым значением, где могут быть неожиданные нули в разных местах. ...DefaultIfEmpty(0).Sum(0)
может помочь в этом (довольно простом) случае, когда не может быть элементов, а sql SUM
возвращает 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 для объектов.
Это сообщение об ошибке, когда я пытался выбрать из представления.
Проблема заключалась в том, что в последнее время были получены новые новые строки (в столбце SubscriberId), и он не был обновлен в EDMX (Сначала база данных EF).
Столбец должен был иметь тип Nullable для работы.
var dealer = Context.Dealers.Where (x => x.dealerCode == dealerCode ) .FirstOrDefault ();
Перед обновлением просмотров:
public int SubscriberId { get; set; }
После обновления обновления:
public Nullable<int> SubscriberId { get; set; }
Удалено и добавлено представление в EDMX .
Надеюсь, это поможет кому-то.
Я вижу, что на этот вопрос уже дан ответ. Но если вы хотите, чтобы он был разделен на два утверждения, можно рассмотреть следующее.
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;
Я использую этот код, и он отвечает правильно, только выходное значение равно 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
}
Получил эту ошибку в 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;
Вы используете функцию aggregate
, которая не получает элементы для выполнения действия, вы должны проверить, что запрос linq дает некоторый результат, как показано ниже:
var maxOrderLevel =sdv.Any()? sdv.Max(s => s.nOrderLevel):0
Чтобы разрешить поле с нулевым значением Amount
, просто используйте оператор нулевой коалесценции для преобразования нулей в 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();
Amount
является int
, то мы уже уверены, что он не может быть нулевым, и объединение не требуется. Если вы получаете сообщение об ошибке, то Amount
не имеет значения NULL, это просто int
, и в этом случае, возможно, вам нужно изменить столбец dbml linq2sql в конструкторе, чтобы разрешить null.
– recursive
28 July 2011 в 21:14