诠释? 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_ID
和t.ID
之间的比较引起的,因为p.child_ID
是int?
而t.ID
是int
。 但是, 我该如何解决这个问题呢? 如何在没有此错误的情况下执行LEFT OUTER JOIN
?
p.child_ID
是int?
因为此列在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-int , p.child_ID
与非nullable-int , t.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 { //... };