【发布时间】:2011-08-07 12:02:17
【问题描述】:
如何在可为空的列上加入表?
我有以下 LINQ 查询,RMA.fiCharge 可以为 NULL:
Dim query = From charge In Services.dsERP.ERP_Charge _
Join rma In Services.dsRMA.RMA _
On charge.idCharge Equals rma.fiCharge _
Where rma.IMEI = imei
Select charge.idCharge
我在query.ToArray() 中收到“从类型 'DBNull' 到类型 'Integer' 的转换无效”:
Dim filter = _
String.Format(Services.dsERP.ERP_Charge.idChargeColumn.ColumnName & " IN({0})", String.Join(",", query.ToArray))
所以我可以在查询中附加一个WHERE RMA.fiCharge IS NOT NULL。但是如何在 LINQ 中做到这一点,还是有其他选择?
提前谢谢你。
解决办法:
问题在于 DataSet 不支持 Nullable-Types,但如果您在整数列上查询任何 NULL-Values,则会生成 InvalidCastException(感谢 Martinho)。
dahlbyk 修改后的 LINQ 查询几乎不需要修改。 DataSet 为 AllowDbNull=True 的每一列生成一个布尔属性,在本例中为 IsfiChargeNull。
Dim query = From charge In Services.dsERP.ERP_Charge _
Join rma In (From rma In Services.dsRMA.RMA _
Where Not rma.IsfiChargeNull
Select rma)
On charge.idCharge Equals rma.fiCharge _
Where rma.IMEI = imei
Select charge.idCharge
【问题讨论】:
-
您是否使用可空整数?你为什么用 linq-to-objects 标记这个? LINQ-to-Objects 没有 SQL。
-
不,类型化数据集中的DataColumn是整数类型。
-
那是你的问题。您需要可为空的整数。
-
@Martinho:谢谢,我明天看看。您的意思是当 LINQ 迭代行时数据集本身会引发异常?我已将其标记为 LINQ-To-Objects,因为它是对类型化数据集的查询。忽略引发异常的 SQL,即稍后我想在 DataView 上应用的过滤器字符串。我不明白的是:如果我通过 LINQ 加入表,为什么 result.ToArry() 会抛出一个只有在
fiCharge IS NULL时才会发生的异常,我假设我会用 JOIN 阻止什么? -
我不确定(我从未使用过类型化数据集),但我想这是因为存储了来自数据库的原始数据,并且只有当您使用
ToArray()实现查询时才执行对象被创建。也许客户端连接的工作方式与 SQL JOIN 不同,并且还包括空值。由于您不能将 int 设置为 null(当然,除非它可以为空),因此它会失败。或不。我只是在这里猜测。
标签: .net vb.net linq linq-to-dataset