Исключить нулевые значения при суммировании по конкретному столбцу в левой объединенной таблице с помощью LINQ - PullRequest
0 голосов
/ 15 декабря 2018

Я прочитал несколько ответов по SO, но думаю, что они не решают мою проблему.Я был бы счастлив, если бы кто-то мог указать мне на тот, который имеет отношение.Рассмотрим следующие таблицы:

enter image description here

Существуют различные тарифы, по которым может взиматься плата за бронирование, и может быть многократных или без сборов забронирование .Каждый заряд имеет свою ставку (в $).Так, например, за забронированный автомобиль можно взимать плату за Позднее прибытие за 200 долларов, а за другой сбор Не показывать за 450 долларов.Эти тарифы могут отличаться для каждого бронирования, и не во всех бронированиях взимается плата.

Теперь я хочу показать общую сумму, взимаемую при бронировании, если таковая имеется.Для этого у меня есть следующий запрос LINQ:

Dim q = (From b In _db.Bookings
           Select New With {
                .Bid = b.ID,
                <some other columns from booking table>
                .TotalCharges = b.BookingCharges.Sum(Function(o) o.Rate)
           }).ToList()

Запрос возвращает ошибку:

"Ошибка приведения к типу значения 'System.Int32', поскольку материализованное значениеnull. Либо универсальный параметр результирующего типа, либо запрос должен использовать тип, допускающий значение NULL. "

Поскольку существуют заказы, для которых нет начислений (NULL) и, следовательно, их нельзя суммировать.Я пытался использовать .TotalCharges = b.BookingCharges.DefaultIfEmpty().Sum(Function(o) o.Rate) и .TotalCharges = b.BookingCharges.Sum(Function(o) o.Rate or 0), но та же ошибка.Я прочитал ответы на SO, связанные с этой ошибкой, но чувствую, что у OP другая проблема или запрос, чем у меня, а также все ответы на C #.

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Я нашел решение.Применяется IF ко всему новому столбцу, а не только к определенному столбцу в объединяющей таблице (Rate Столбец), поскольку NULL не исходит из столбца Rate, он возникает из пустой записи BookingCharge против Booking(прикрепляется к запросу в виде столбца .TotalCharges), поэтому весь столбец должен пройти оператор IF (COALESCENCE).

.TotalCharges = If(b.BookingCharges.Sum(Function(o) o.Rate) <> Nothing, b.BookingCharges.Sum(Function(o) o.Rate), 0)

Благодаря Namrehs и this ТАК ответ.

0 голосов
/ 15 декабря 2018

Попробуйте использовать оператор If () :

Dim q = (From b In _db.Bookings
    Select New With {
        .Bid = b.ID
        .TotalCharges = b.BookingCharges.Sum(Function(o) If(o.Rate,0))
}).ToList()

Если это не сработает, возможно, попробуйте что-то вроде этого:

Dim q = (From b In _db.Bookings
    Select New With {
        .Bid = b.ID
        .TotalCharges = b.BookingCharges.Where(Function(r) r.Rate IsNot Nothing).Sum(Function(o) o.Rate)
}).ToList()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...