将SQL转换为Linq查询

时间:2016-03-01 05:08:21

标签: c# sql linq

目前我有像

这样的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查询,因为该表在数据库中不存在,它是一个动态创建的虚拟表。

3 个答案:

答案 0 :(得分:2)

复杂的查询,尽我所能让它发挥作用。

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

答案 1 :(得分:1)

这个SQL可以像这样重写

Marshal.SizeOf() == 10

其对应的Linq for DataTable将是

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)

小提琴是here

答案 2 :(得分:0)

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