【问题标题】:LINQ-Join tables on nullable columns可空列上的 LINQ 连接表
【发布时间】: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


【解决方案1】:

您是否尝试将空检查添加到您的 where 子句中?

Dim query = From charge In Services.dsERP.ERP_Charge _
            Join rma In Services.dsRMA.RMA _
              On charge.idCharge Equals rma.fiCharge _
            Where rma.fiCharge <> Nothing AndAlso rma.IMEI = imei
            Select charge.idCharge

如果这不起作用,您可以尝试以下方法:

Dim query = From charge In Services.dsERP.ERP_Charge _
            Join rma In (From rma in Services.dsRMA.RMA _
                         Where rma.fiCharge IsNot Nothing
                         Select rma)
              On charge.idCharge Equals rma.fiCharge _
            Where rma.IMEI = imei
            Select charge.idCharge

【讨论】:

  • 谢谢,将rma.fiCharge &lt;&gt; Nothing 替换为Not rma.IsfiChargeNull 后第二个查询有效:)
【解决方案2】:

虽然您可以使用 LINQ to Datasets 来解决此问题,但您可能会发现使用预定义的 DataRelations 而不是 ad-hoc 连接可以获得更好的性能。有关数据关系的信息,请参阅http://msdn.microsoft.com/en-us/library/dbwcse3d.aspx

如果您确实使用 LINQ to Datasets,您可能想在http://www.manning.com/marguerie/ 上查看我们关于它们的免费赠品第 14 章。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多