首页 / .NET / 正文

[Linq].NET/C#程序开发中如何像SQL语句一样做left join和group by 以及count统计查询?

3960 发布于: 2018-02-05 读完约需6分钟

问题描述

比如现在有SQL查询语句如下:

SELECT p.ParentId, COUNT(c.ChildId)
FROM ParentTable p
  LEFT OUTER JOIN ChildTable c ON p.ParentId = c.ChildParentId
GROUP BY p.ParentId

如何将这条SQL语句转换成对应的Linq查询语句呢?如下的写法是不正确的:

from p in context.ParentTable
join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1
from j2 in j1.DefaultIfEmpty()
group j2 by p.ParentId into grouped
select new { ParentId = grouped.Key, Count = grouped.Count() }

正确的Linq to SQL又是如何写的呢?

方案一

from p in context.ParentTable
join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1
from j2 in j1.DefaultIfEmpty()
group j2 by p.ParentId into grouped
select new { ParentId = grouped.Key, Count = grouped.Count(t=>t.ChildId != null) }

方案二

可以考虑使用子查询,如:

from p in context.ParentTable
let cCount =
(
  from c in context.ChildTable
  where p.ParentId == c.ChildParentId
  select c
).Count()
select new { ParentId = p.Key, Count = cCount } ;

方案三

from p in context.ParentTable
join c in context.ChildTable on p.ParentId equals c.ChildParentId into g
select new { ParentId = p.Id, Count = g.Count() }

如果使用Lambda查询表达式,可以写成这样的:

context.ParentTable
    .GroupJoin(
                   inner: context.ChildTable
        outerKeySelector: parent => parent.ParentId,
        innerKeySelector: child => child.ParentId,
          resultSelector: (parent, children) => new { parent.Id, Count = children.Count() }
    );

方案四

(from p in context.ParentTable
  join c in context.ChildTable
    on p.ParentId equals c.ChildParentId into j1
  from j2 in j1.DefaultIfEmpty()
     select new {
          ParentId = p.ParentId,
         ChildId = j2==null? 0 : 1
      })
   .GroupBy(o=>o.ParentId)
   .Select(o=>new { ParentId = o.key, Count = o.Sum(p=>p.ChildId) })

方案五

from p in context.ParentTable
join c in context.ChildTable on p.ParentId equals c.ChildParentId into joined
select new { ParentId = p.ParentId, Count = joined.Count() }

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: [Linq].NET/C#程序开发中使用Linq在不创建新对象的情况下如何修改集合元素中的某个指定属性的值?

下一篇: [Linq].NET/C#程序开发中使用Linq如何从一个集合List<T>中提取一个属性的惟一值并连接成一个字符串?

本文永久链接码友网 » [Linq].NET/C#程序开发中如何像SQL语句一样做left join和group by 以及count统计查询?

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册