使用LINQ

时间:2018-12-15 16:06:31

标签: sql-server vb.net entity-framework linq

我已经阅读了关于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),因此无法进行汇总。我尝试使用.TotalCharges = b.BookingCharges.DefaultIfEmpty().Sum(Function(o) o.Rate).TotalCharges = b.BookingCharges.Sum(Function(o) o.Rate or 0),但出现相同的错误。我已经阅读了与该错误相关的SO答案,但我认为OP的问题或查询与我的有所不同,而且答案都是C#。

2 个答案:

答案 0 :(得分:2)

尝试使用If() operator

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()

答案 1 :(得分:0)

我找到了解决方案。将IF应用于整个新列,而不只是应用于联接表(Rate列)中的特定列,因为NULL并非源自Rate列,而是源自空BookingChargeBooking(作为查询列.TotalCharges附加到查询)进行记录,因此整个列都应经过IF语句(COALESCENCE)。

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

感谢Namrehs和this的回答。