2013-03-01 129 views
0

我想要连接两个查询。在这第一个查询将包含4条记录和第二个查询将包含0或更多的记录多达4.我想加入这两个,并希望得到4条记录。如果在第二个查询中有任何记录,那么我想从第二个表获得许可。我写过类似的代码。如何在linq中左连接两个查询

var finalquery = values.GroupJoin(records, i => i.typeid, j => j.typeid, (i, j) => new { i, j }).SelectMany(i => i.j.DefaultIfEmpty(), (i, j) => new { 
      id = i.i.typeid, 
      Permission = (j.premission ==null)?null:j.premission 

     }).ToArray(); 

但它抛出一个异常

+0

有什么异常? – GrandMasterFlush 2013-03-01 10:06:29

+0

@GrandMasterFlush空引用异常 – Pa1 2013-03-01 10:07:42

回答

0

你的NullReferenceException在此条件下:

j.premission ==null 

这将引发当j是null(默认情况下)。

var finalquery = values.GroupJoin(records, 
            v => v.typeid, 
            r => r.typeid, 
           (v, g) => new { v, g }) 
         .SelectMany(x => x.g.DefaultIfEmpty(), 
            (x, r) => new { 
            id = x.v.typeid, 
            Permission = r == null ? null : r.permission 
            }) 
         .ToArray(); 

或者与查询语法(转换成数组省略美):

var finalquery = 
    from v in values 
    join r in records on v.typeid equals r.typeid into g 
    from r in g.DefaultIfEmpty() 
    select new { 
     id = v.typeid, 
     Permission = r == null ? null : r.permission 
    }; 
+0

我试过你的代码,但我得到了同样的异常。我的代码和你的代码有什么区别。对不起,我的语言 – Pa1 2013-03-01 10:30:21

+0

@ Pa1好吧,最初在代码中没有默认值检查,并且您的代码对范围变量命名不当。 'i'是一个匿名对象,'i'是该对象的一个​​属性,'i'是一个来自值的值。顺便说一句,我的代码与MS SQL工作正常 – 2013-03-01 10:33:46

+0

@ Pa1我发现区别!当j默认为'j.premission == null'时,你有例外 – 2013-03-01 10:36:09