将 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查询,因为数据库中不存在此表,它是动态创建的虚拟表。
有点复杂的查询,尽我所能让它工作。
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/