我尝试转换此查询语法:
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, 如何让第二个查询像第一个一样工作
感谢
答案 0 :(得分:2)
语法并不重要 - 您可以使用任一语法执行一个或另一个。
区别在于构建查询的方式(在帖子标题中提到) - join
(Join
)+ group by
(GroupBy
)vs {{ 1}}(join into
)。
前者基本上相当于SQL的做法。虽然GroupJoin
是LINQ特定的构造。需要注意的重要一点是它具有左外连接语义(实际上它用于模拟LINQ中的左外连接)。在许多方面,它比SQL方式更好,因为它避免了结果的冗余分组。从另一方面来看,由于左外连接语义,它总是返回外部记录。如果要过滤掉没有匹配内部记录的外部记录,则必须自己执行此操作。例如,通过在第二个查询结尾添加
GroupJoin
或者一般来说,使用以下模式:
.Where(x => x.Count != 0)