C# T-SQL到Linq:将组中的日期diff转换为

C# T-SQL到Linq:将组中的日期diff转换为,c#,sql-server,linq,c#-4.0,C#,Sql Server,Linq,C# 4.0,我在SQL中有以下数据集,我需要将其从TSQL转换为C#中的LINQ 这是我用来运行此数据集的T-SQL select name, min(sampletime) as startdate, max(sampletime) as enddate from #sampledata where samplevalue is null group by name, block having datediff(minute, min(sampletime), max(

我在SQL中有以下数据集,我需要将其从TSQL转换为C#中的LINQ

这是我用来运行此数据集的T-SQL

select 
    name,
    min(sampletime) as startdate, 
    max(sampletime) as enddate
from #sampledata where samplevalue is null
group by
    name, block
having datediff(minute, min(sampletime), max(sampletime)) >= 5
order by name, startdate
分组很容易转换,但是我不确定如何处理having子句,更具体地说,如何使用聚合处理c#中的datediff

having datediff(minute, min(sampletime), max(sampletime)) >= 5
这就是我到目前为止所做的:

var query = (from s in sampledata
                         where s.block.HasValue == false
                         group b by new { Name = s.Name, Block = b.Block     } into g
                         select new
                         {
                             Name = g.Name,
                             StartDate = g.Min(a => a.SampleTime),
                             EndDate = g.Max(a => a.SampleTime)

                         });

以下是如何编写该查询:

from x in Sampledata
where x.Samplevalue == null
group x by new { x.Name, x.Block } into g
let name = g.Key.Name
let startdate = g.Min(x => x.Sampletime)
let enddate = g.Max(x => x.Sampletime)
where SqlMethods.DateDiffMinute(startdate.Value, enddate.Value) >= 5
orderby name, startdate
select new { name, startdate, enddate }
请注意,您可能不会得到完全相同的查询,但它应该足够接近

但是如果您无法使用
SqlMethods
,那么您可以做的下一件事是:

from x in Sampledata
where x.Samplevalue == null
group x by new { x.Name, x.Block } into g
let name = g.Key.Name
let startdate = g.Min(x => x.Sampletime)
let enddate = g.Max(x => x.Sampletime)
where (startdate.Value - enddate.Value).Minutes >= 5
orderby name, startdate
select new { name, startdate, enddate }

那么你已经有LINQ来创建群组了?我想你的进步方式将取决于你是如何做到的,看到了吗?我们能看到LINQ吗?为什么不公布你做了什么。顺便说一句,LINQ太宽了。LINQ到Sql?LINQ到实体?或者?我编辑了这个问题,添加了到目前为止的代码。非常感谢。
from x in Sampledata
where x.Samplevalue == null
group x by new { x.Name, x.Block } into g
let name = g.Key.Name
let startdate = g.Min(x => x.Sampletime)
let enddate = g.Max(x => x.Sampletime)
where (startdate.Value - enddate.Value).Minutes >= 5
orderby name, startdate
select new { name, startdate, enddate }