C# 将SQL转换为Linq查询

C# 将SQL转换为Linq查询,c#,sql,linq,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 现在我有了数据表中的数据,我

目前我有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查询,因为数据库中不存在此表,它是动态创建的虚拟表。

我建议使用LINQPad4。这样做很容易,这将在编写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()}); 
var result=table.AsEnumerable().Where(u=>u.Field(“createdTime”)>DateTime.Now.AddDays(-7))//减去一周
.GroupBy(g=>new{userid=g.Field(“userid”),span=g.Field(“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()});

工作

此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是

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;
var users=myDataTable.AsEnumerable()
.选择(r=>new{
UserId=r.Field(“UserId”),
CreatedTime=r.Field(“CreatedTime”)
}).ToList();
var groupedUsersResult=来自用户,其中user.CreatedTime>user.CreatedTime.AddDays(-7)按用户分组
新建{user.CreatedTime.Year,user.CreatedTime.Month,user.CreatedTime.Day,分钟=(user.CreatedTime.Minute/5),user.UserId}
进入groupedUsers选择groupedUsers;

小提琴是在线试穿的converter@mohan111你能分享一下有用的吗。我安装了Linqer和Linqpad,但似乎无法正常工作。试试这个:@VVN mohan111谢谢各位,但我的数据库中没有这个表,我只是让Linqer正常工作,并且声明数据库中不存在这个表。这是在运行时创建的虚拟表我在数据库中没有使用linqpad/LINQERTANKS Hari创建查询的表,让我检查一下这一点span=g.Field(“createdTime”).Minute}实际上是span=g.Field(“createdTime”).Minute/5},在5分钟的时间段中分割数据