将 SQL 转换为 Linq 查询

本文关键字:Linq 查询 转换 SQL | 更新日期: 2023-09-27 18:36:45

目前我有SQL查询,例如

 select tt.userId, count(tt.userId) from (SELECT userId,COUNT(userId) as cou
  FROM [dbo].[users]
  where createdTime> DATEADD(wk,-1,GETDATE())
   group by userId,DATEPART(minute,createdTime)/5) tt group by tt.userId

现在我在数据表中有了数据,我需要将上面的查询转换为 LINQ 并针对数据表执行。我不能这样做,谁能帮我。

这就是查询的作用,它将用户分组为 5 分钟的时间段,然后计算每个用户的时间段数。

注意:我无法使用Linqer创建Linq查询,因为数据库中不存在此表,它是动态创建的虚拟表。

将 SQL 转换为 Linq 查询

有点复杂的查询,尽我所能让它工作。

var result = table.AsEnumerable().Where(u=> u.Field<DateTime>("createdTime") > DateTime.Now.AddDays(-7)) //subtract a week
        .GroupBy(g=> new { userid = g.Field<string>("userId") , span = g.Field<DateTime>("createdTime").Minute })
        .Select(g=> new { userid = g.Key.userid, count = g.Count()})
        .GroupBy(g=> g.userid ).Select(s=> new {userid = s.Key, count = s.Count()}); 

工作Demo

这个SQL可以这样重写

SELECT
  COUNT(U.UserId),
  U.[createdTime]
FROM USERS U WHERE createdTime> DATEADD(wk,-1,GETDATE())
GROUP BY U.UserId,
         DATEPART(MONTH, U.[createdTime]),
         DATEPART(DAY, U.[createdTime]),
         DATEPART(HOUR, U.[createdTime]),
         (DATEPART(MINUTE, U.[createdTime]) / 5)

它对应的 Linq for DataTable 将是

var users =  myDataTable.AsEnumerable()
                .Select(r=> new {
                    UserId = r.Field<int>("UserId"),
                    CreatedTime = r.Field<DateTime>("createdTime")
                }).ToList();
            var groupedUsersResult = from user in users where user.CreatedTime > user.CreatedTime.AddDays(-7) group user by 
                                   new {user.CreatedTime.Year,user.CreatedTime.Month,user.CreatedTime.Day,Minute=(user.CreatedTime.Minute/5),user.UserId}
                                   into groupedUsers select groupedUsers;

小提琴来了

我建议使用LINQPad4。这样做很容易,这将对编写 LINQ 查询有很大帮助。https://www.linqpad.net/