Подтвердить что ты не робот

Значение 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. Любые идеи?

4b9b3361

Ответ 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 во втором столбце и во второй таблице. И он будет работать. "Приведение в значение типа" Двойной "не удалось, поскольку материализованное значение равно нулю" будет решено Благодаря