我已经阅读了关于SO的一些答案,但我认为它们不能解决我的问题。如果有人可以指出我相关的内容,我会很高兴。请考虑以下表格:
可能会有不同的收费标准,每次预订可能有多次收费或没有收费。每个费用都有其自己的费率(以美元为单位)。所以例如所预订的车辆可能会收取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#。
答案 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
列,而是源自空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的回答。