Значение cast для значения "Double" не выполнено, потому что материализованное значение равно null
CODE:
double cafeSales = db.InvoiceLines
.Where(x =>
x.UserId == user.UserId &&
x.DateCharged >= dateStart &&
x.DateCharged <= dateEnd)
.Sum(x => x.Quantity * x.Price);
Ошибка:
Приведение значения в значение типа "Двойной" не выполнено, потому что материализованное значение равно нулю. Либо общий параметр типа результата, либо запрос должен использовать тип с нулевым значением.
ЧТО Я УВИДЕТЬ УЖЕ:
Недопустимое значение cast для значения 'Int32', потому что материализованное значение равно null
Признак типа "Десятичный" не выполнен, потому что материализованное значение равно null
ЧТО Я ИСКЛЮЧАЮ:
double cafeSales = db.InvoiceLines
.Where(x =>
x.UserId == user.UserId &&
x.DateCharged >= dateStart &&
x.DateCharged <= dateEnd)
.DefaultIfEmpty()
.Sum(x => x.Quantity * x.Price);
и
double? cafeSales = db.InvoiceLines
.Where(x =>
x.UserId == user.UserId &&
x.DateCharged >= dateStart &&
x.DateCharged <= dateEnd)
.Sum(x => x.Quantity * x.Price);
Ни одна из этих работ не работает. Я знаю, что причина проблемы в том, что в этой таблице нет строк в UserId, в которые я перехожу. В этом случае я бы предпочел, чтобы Sum() только что вернул мне 0. Любые идеи?
Ответы
Ответ 1
Лучшее решение
double cafeSales = db.InvoiceLines
.Where(x =>
x.UserId == user.UserId &&
x.DateCharged >= dateStart &&
x.DateCharged <= dateEnd)
.Sum(x => (double?)(x.Quantity * x.Price)) ?? 0;
Ответ 2
Вы можете проверить, есть ли в коллекции правильные результаты.
double? cafeSales = null;
var invoices = db.InvoiceLines
.Where(x =>
x.UserId == user.UserId &&
x.DateCharged >= dateStart &&
x.DateCharged <= dateEnd
)
.Where(x => x.Quantity != null && x.Price != null);
if (invoices.Any()) {
cafeSales = invoices.Sum(x => x.Quantity * x.Price);
}
Ответ 3
Я знаю, что это немного устарело, но на всякий случай это помогает кому-то.
@Matt Я предполагаю, что метод DefaultIFEmpty()
должен работать для вас на всякий случай, если вы передадите значение по умолчанию для столбца, на который вы применяете Sum
. Этот метод имеет некоторые перегрузки, которые вы можете проверить, и я предлагаю тип-литье, если перегрузки не поддерживают ваши требования.
(query).DefaultIfEmpty(0)
Ответ 4
Это должно сделать трюк (вам может потребоваться удалить одно из условий, если либо Quantity
, либо Price
не имеют значения NULL):
var cafeSales = db.InvoiceLines
.Where(x =>
x.UserId == user.UserId &&
x.DateCharged >= dateStart &&
x.DateCharged <= dateEnd &&
x.Quantity != null &&
x.Price != null);
double cafeSalesTotal = 0;
if (cafeSales.Any())
{
cafeSalesTotal = cafeSales.Sum(x => x.Quantity * x.Price);
}
Ответ 5
var cafeSales = db.InvoiceLines
.Where(x =>
x.UserId == user.UserId &&
x.DateCharged >= dateStart &&
x.DateCharged <= dateEnd)
.Sum(x => x.Quantity * x.Price);
double i;
if(cafeSales==null) ? i=0 : i=(double)cafeSales.First();
Ответ 6
Вышеупомянутые решения для меня не сработали. Моя проблема была схожа. Я был уверен, что никакие строки не возвращаются, но Sum ведет себя каким-то странным образом. Поэтому я решил добавить чек непосредственно перед вызовом лямбда-выражения, где я проверяю свойство count строк, возвращаемых лямбдой. Если он больше нуля, я вызываю выражение суммы. Это сработало для меня.
Ответ 7
join sim in ctx.EF.Collaterals on new { id = ini.cam.id, Type = 0 } equals new
{ id = sim.CampaignId == null ? new Guid() : sim.CampaignId, sim.Type }
into tempcoll
from sim in tempcoll.DefaultIfEmpty()
Это решение работает. Фактически вам нужно использовать тернарный оператор, чтобы проверить значение и вставить Guid, если null во втором столбце и во второй таблице. И он будет работать.
"Приведение в значение типа" Двойной "не удалось, поскольку материализованное значение равно нулю" будет решено
Благодаря