.net - LINQ-在可为空的列上连接表

标签 .net vb.net linq linq-to-dataset

如何在可为空的列上连接表?

我有以下 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 为每个允许 DbNull=True 的列生成一个 bool 属性,在本例中为 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

最佳答案

您是否尝试过将 null 检查添加到 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

关于.net - LINQ-在可为空的列上连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5696888/

相关文章:

c# - 之间的Linq性能

c# - LINQ to Entities : Using DateTime. Lambda 表达式中的 AddMonth

c# - 有多少天属于某个日期范围?

c# - 为什么我不应该总是使用 ICollection 而不是 IEnumerable?

c# - 正确地自动创建用于开发的自签名证书

vb.net - 如何完全停止运行代码并退出应用程序?

vb.net - 为什么VB.NET中这个类有参数?

VB.NET 2010 - Process.Start ("filePath\Test.bat")未打开 test.bat?

c# - 如果编译器可以对整数文字执行隐式缩小转换,那么它也应该

c# - 多线程编程