关于Linq Group by + 去重 + 计数的问题

christie7h 2014-05-26 10:20:54
有一张表的数据格式是这样的
IP userid login_date
1.1.1.1 zhangsan 2014-01-01 8:00
2.2.2.2 lisi 2014-02-02 8:00
3.3.3.3 wangwu 2014-03-03 11:00
2.2.2.2 zhaoliu 2014-04-04 12:00
2.2.2.2 lisi 2014-05-05 11:00

我想将这张表查询成这种格式
IP Login Count
1.1.1.1 1
2.2.2.2 2
3.3.3.3 1

也就是 哪个IP 登录了多少个用户 , 所以需要以ip来分组查询并且将用户id 进行去重复然后计数

用SQL 语句 这样查询是可以的


SELECT TOP(10) ip, COUNT(DISTINCT userid) FROM login_log
GROUP BY IP


但是如果转换成LINQ 目前能想到的方法是这样的, 不过这种查询方式速度方面很差劲, 高手帮忙想个好办法吧 谢谢!


var Data = (from t in db.login_log
group t by new
{
ip = t.ip
} into g
select new
{
ip = g.Key.ip,
count = ((from p in db.login_log where p.ip == g.Key.ip select p.userid).Distinct().Count())
}).ToList();


...全文
791 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
q7885291 2015-06-11
  • 打赏
  • 举报
回复
var query =from p in list group p by p.IP into g select new { g.Key, count= g.Count() };
「已注销」 2014-05-26
  • 打赏
  • 举报
回复
好吧 可能是我表达问题表达的不够明白 其实我就是想把下面的语句转换成 LINQ语句 可是效果都不怎么好
SELECT  ip, COUNT(DISTINCT userid) FROM login_log 
GROUP BY IP
我原来的语句已经实现,只是这个方法有些笨, 就是想找个比这个效率更好的语句

var data = from t in db.login_log
                         group t by new 
                         {
                             ip = t.ip                             
                         } into g 
                         select new
                         {
                             ip = g.Key.ip,
                             count = ((from p in db.login_log where  p.ip == g.Key.ip select p.userid).Distinct().Count())
                         }
游离失所 2014-05-26
  • 打赏
  • 举报
回复
var result=db.login_log.GroupBy(x=>x.ip).select(x=>new {IP=x.key,count=x.disticx忘记了().count()});
threenewbee 2014-05-26
  • 打赏
  • 举报
回复
count = g.GroupBy(y => y.userid).Count()
「已注销」 2014-05-26
  • 打赏
  • 举报
回复
引用 2 楼 yongchaochu 的回复:
var q = db.Table.Distinct(p=>p.userId).GroupBy(x => new { x.ip }) .Select(g => new { g.Key.Name, top = g.Count(s => s.Count()) });
如果首先 Distinct(p=>p.userId) 这样的话 会有个问题 因为有的用户 会有多个ip登录的记录 所以一定要以 ip为基准 进行查询
threenewbee 2014-05-26
  • 打赏
  • 举报
回复
count = g.GroupBy(y => y.ip).Count()
yongchaochu 2014-05-26
  • 打赏
  • 举报
回复
var q = db.Table.Distinct(p=>p.userId).GroupBy(x => new { x.ip }) .Select(g => new { g.Key.Name, top = g.Count(s => s.Count()) });
「已注销」 2014-05-26
  • 打赏
  • 举报
回复
自己顶一下
「已注销」 2014-05-26
  • 打赏
  • 举报
回复
谢谢 大家 我还是用我自己的方法了 优化了一下 速度还可以
「已注销」 2014-05-26
  • 打赏
  • 举报
回复
谢谢以上几位百忙之中给予的回复, 不过和我想要的效果是不一样... 这个表是登录日志的数据表 就是当用户成功登陆的时候会在这张表上记录下用户IP和用户ID 查询结果的用处就是 看看一个ip 地址下 登陆了多少个用户id 的数量(不是次数) 最终呈现结果应该是这样, 查询思路应该是 按照ip 进行 group by 然后 将每个ip分组下的 用户进行去重复 然后将去重复的用户id 进行计数 IP Login Count 202.1.1.2 1 (这里有一个用户ID登陆过) 202.1.1.3 2 (这里有两个用户ID 在这里登陆过) 202.1.1.5 1

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧