实体框架组加入不同的结果与加入组

时间:2016-04-30 18:43:02

标签: entity-framework linq

我尝试转换此查询语法:

 res = from co in db.SALES
                  join
                   op in db.OPERATORS
                   on co.ID_OP equals op.ID
                  where co.DATA_CLOSE == null
                  group new { co, op } by new { op.ID, op.NAME } into g
                  select new
                  {
                      ID = g.Key.ID,
                      NAME= g.Key.NAME,
                      COUNT = g.Select(x => x.co).Count()

                  };

方法语法:

res= db.OPERATORS.GroupJoin(
              db.SALES.Where(c=>c.DATA_CLOSE==null),
               op => op.ID,
               co => co.ID_OP,
             (co, grp) =>
             new 
        {
            NAME= co.NAME,
            COUNT    = grp.Select(x=>x.ID ).Count()
             });

第一个查询按预期工作,就像内部联接一样,我只获得了打开销售计数的运算符 第二个给我所有运营商打开销售数量,如果没有开售,它给我0, 如何让第二个查询像第一个一样工作

感谢

1 个答案:

答案 0 :(得分:2)

语法并不重要 - 您可以使用任一语法执行一个或另一个。

区别在于构建查询的方式(在帖子标题中提到) - joinJoin)+ group byGroupBy)vs {{ 1}}(join into)。

前者基本上相当于SQL的做法。虽然GroupJoin是LINQ特定的构造。需要注意的重要一点是它具有左外连接语义(实际上它用于模拟LINQ中的左外连接)。在许多方面,它比SQL方式更好,因为它避免了结果的冗余分组。从另一方面来看,由于左外连接语义,它总是返回外部记录。如果要过滤掉没有匹配内部记录的外部记录,则必须自己执行此操作。例如,通过在第二个查询结尾添加

GroupJoin

或者一般来说,使用以下模式:

.Where(x => x.Count != 0)