当其中一种数据类型可以为空而另一种不能为空时,是不是可以使用 linq 进行匿名连接? [复制]

Posted

技术标签:

【中文标题】当其中一种数据类型可以为空而另一种不能为空时,是不是可以使用 linq 进行匿名连接? [复制]【英文标题】:Is there anyway anonymous joins using linq may be performed when one of the datatypes is nullable and the other isn't? [duplicate]当其中一种数据类型可以为空而另一种不能为空时,是否可以使用 linq 进行匿名连接? [复制] 【发布时间】:2021-12-22 15:50:38 【问题描述】:

如果这个问题已经被问过,那么请引导我到 SO 链接,这样我可以避免上当受骗。但我找不到任何可以直接回答问题的内容。

我有以下场景

var result = (from a in table1
                join b in table2
                  on a.column equals b.column
                join c in table3
                  on b.column equals c.column
                join d in table4
                  on new  a.column2, c.column2  
                     equals  d.column3, d.column6  
             select a);

问题是 table3 的 column2 和 table4 的 column6 都是 int 类型,但 1 可以为空,而另一个不是,这导致“连接子句中的一个表达式的类型不正确强>”

我理解错误,但我的问题;有没有办法解决?还是我只是在尝试使用 linq 达到我需要的结果的死胡同?

我试图通过使用可为空类型的 Value 属性来使连接工作,但这不起作用。如果没有其他方法可以使用 linq 实现此目的,那么我将不得不将所有代码移动到 SPROC 中的 SQL 中,而我不想这样做。

我注意到我可以在匿名声明之外执行连接,而 linq 对此没有任何问题;但我需要一个复合连接。

谢谢

【问题讨论】:

【参考方案1】:

您需要在匿名类型标签中给出属性,并且标签必须相同。然后,您可以将不可为空的int 转换为可空的int

var result = (from a in table1
                join b in table2
                  on a.column equals b.column
                join c in table3
                  on b.column equals c.column
                join d in table4
                  on new  JoinColumn1 = a.column2, JoinColumn2 = (int?)c.column2  
                     equals  JoinColumn1 = d.column3, JoinColumn2 = d.column6  
             select a);

【讨论】:

谢谢,这正是我所需要的。很抱歉这个被骗的问题。

以上是关于当其中一种数据类型可以为空而另一种不能为空时,是不是可以使用 linq 进行匿名连接? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

检查数组是否为空而不获取NullPointerException

我有一种形式可以更新mysql中的某些值,当输入为空时,如何避免更新单元格?

当条件全部为空时,查询全部,当其中一个或两个条件为空时,为空的条件不查询,sql怎么写

当 WPF 中的绑定为空时,如何避免 xaml 警告?

如何使用火花流检查 rdd 是不是为空?

当字段为空时,如何让内容类型中的链接字段显示默认文本