诠释? Linq问题中LEFT OUTER JOIN时的int和int比较

我正在开发一个需要使用Linq-To-Sql的WinForms项目。 我已经能够使用SqlMetal工具创建我的DataContext,并进行一些查询。 但是现在我遇到了一个我无法解决的问题。

我正在尝试进行LEFT OUTER JOIN ,如下所示:

 MyDatabase db = new MyDatabase(...); var query = from p in db.ParentTable join t in db.ChildTable on new {A = p.child_ID, B = p.OtherID} equals new {A = t.ID, B = t.OtherID} into j1 from c in j1.DefaultIfEmpty() select new { ... }; 

当我编写此查询时,在编译时在连接词中引发错误:

join子句中某个表达式的类型不正确。 调用’GroupJoin’时类型推断失败

我知道这个错误是由p.child_IDt.ID之间的比较引起的,因为p.child_IDint?t.IDint 。 但是, 我该如何解决这个问题呢? 如何在没有此错误的情况下执行LEFT OUTER JOIN

p.child_IDint? 因为此列在SQL标记为IS NULL

希望有人可以帮助我,提前谢谢。

您可以使用GetValueOrDefault()方法。 它检索当前Nullable对象的值或对象的默认值。

就你的例子而言:

 var query = from p in db.ParentTable join t in db.ChildTable on new {A = p.child_ID.GetValueOrDefault(0), B = p.OtherID} equals new {A = t.ID, B = t.OtherID} into j1 from c in j1.DefaultIfEmpty() select new { ... }; 

如果p.child_ID变为null,则返回0.希望这会有所帮助!!

第一个问题是属性名称应该与所说的casperOne♦相同,但第二个问题是你将nullable-intp.child_ID非nullable-intt.ID 。 所以你可以用这种方式使用null-coalescing运算符

 (int)(p.child_ID ?? default(int)) 

在这种情况下,如果它不为null则返回p.child_ID ,否则返回default(int) ,即0

查询将是:

 var query = from p in db.ParentTable join t in db.ChildTable on new {A = (int)(p.child_ID ?? default(T)), B = p.OtherID} equals new {A = t.ID, B = t.OtherID} into j1 from c in j1.DefaultIfEmpty() select new { //... };