我正在处理一个需要使用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
单词引发错误:
联接子句中某个表达式的类型不正确。 对"组加入"的调用中类型推断失败
我知道此错误是由p.child_ID
和t.ID
之间的比较引起的,因为p.child_ID
是int?
的,t.ID
是int
的。但是,我该如何解决这个问题?如何在没有此错误的情况下执行LEFT OUTER JOIN
?
p.child_ID
int?
,因为此列在 SQL
中标记为IS NULL
。
希望有人能帮助我,提前谢谢。
您可以使用 GetValueOrDefault() 方法。它检索当前可为 Null 对象的值或对象的默认值。
就您的示例而言:
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♦ 相同,但第二个问题是你正在比较一个可为空的整数,p.child_ID
,与一个不可为空的整数,t.ID
。因此,您可以通过以下方式使用 null 合并运算符:
(int)(p.child_ID ?? default(int))
在这种情况下返回p.child_ID
如果它不为 null,否则返回 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
{
//...
};