我正在开发一个需要使用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
字词中引发错误:
join子句中某个表达式的类型不正确。调用“GroupJoin”
时类型推断失败
我知道此错误是由p.child_ID
和t.ID
之间的比较引起的,因为p.child_ID
为int?
且t.ID
为int
。但是,我该如何解决这个问题?如何在没有此错误的情况下执行LEFT OUTER JOIN
p.child_ID
为int?
,因为此列在IS NULL
中标记为SQL
。
希望有人可以帮助我,提前谢谢。
答案 0 :(得分:6)
您可以使用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.希望这会有所帮助!!
答案 1 :(得分:4)
第一个问题是属性名称应与所述 casperOne♦相同,但第二个问题是您要比较 nullable-int ,{ {1}}, non-nullable-int ,p.child_ID
。所以你可以用这种方式使用 null-coalescing operator :
t.ID
在这种情况下,如果它不为null则返回(int)(p.child_ID ?? default(int))
,否则返回p.child_ID
,即default(int)
。
查询将是:
0