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

时间:2012-09-13 16:54:35

标签: c# linq linq-to-sql

我正在开发一个需要使用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_IDt.ID之间的比较引起的,因为p.child_IDint?t.IDint。但是,我该如何解决这个问题?如何在没有此错误的情况下执行LEFT OUTER JOIN

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

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

2 个答案:

答案 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