当其中一种数据类型可以为空而另一种不是时,是否可以执行使用 linq 的匿名连接?

Is there anyway anonymous joins using linq may be performed when one of the datatypes is nullable and the other isn't?

如果已经有人问过这个问题,请将我转至 SO link,这样我就可以避免上当受骗。但是我找不到任何直接回答问题的内容。

我有以下场景

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 是可为空的,另一个不是,这导致“join 子句中表达式之一的类型不正确"

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

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

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

谢谢

您需要在匿名类型标签中给出属性,并且标签必须相同。然后,您可以将不可为 null 的 int 转换为可为 null 的 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);