国际?和 int 比较时左外加入 Linq 问题



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

最新更新