【问题标题】:T-SQL to Linq: converting the having datediff in a group byT-SQL 到 Linq:将组中的 datediff 转换为
【发布时间】:2016-08-26 15:31:51
【问题描述】:

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

create table #sampledata 
(
    name nvarchar(50),
    sampletime datetime,
    samplevalue decimal, 
    block int
);

insert into #sampledata (name, sampletime, samplevalue, block) values
('ABC1235', cast('2016/01/01 10:00:00 AM' as datetime), 50.00, 0),
('ABC1235', cast('2016/01/01 10:05:00 AM' as datetime), 50.00, 0),
('ABC1235', cast('2016/01/01 10:10:00 AM' as datetime), 50.00, 0),
('ABC1235', cast('2016/01/01 10:15:00 AM' as datetime), null, 3),
('ABC1235', cast('2016/01/01 10:20:00 AM' as datetime), null, 3),
('ABC1235', cast('2016/01/01 10:25:00 AM' as datetime), null, 3),
('ABC1235', cast('2016/01/01 10:30:00 AM' as datetime), 50.00, 0),
('ABC1235', cast('2016/01/01 10:35:00 AM' as datetime), 50.00, 0),
('ABC1235', cast('2016/01/01 10:40:00 AM' as datetime), 50.00, 0),
('ABC1235', cast('2016/01/01 10:45:00 AM' as datetime), 50.00, 0),
('ABC1235', cast('2016/01/01 10:50:00 AM' as datetime), 50.00, 0),
('ABC1235', cast('2016/01/01 10:55:00 AM' as datetime), 50.00, 0),
('ABC1235', cast('2016/01/01 11:00:00 AM' as datetime), 50.00, 0),
('ABC1235', cast('2016/01/01 11:05:00 AM' as datetime), null, 10),
('ABC1235', cast('2016/01/01 11:10:00 AM' as datetime), null, 10),
('ABC1235', cast('2016/01/01 11:15:00 AM' as datetime), 50.00, 0),
('ABC1235', cast('2016/01/01 11:20:00 AM' as datetime), 50.00, 0),
('ABC1235', cast('2016/01/01 11:25:00 AM' as datetime), 50.00, 0),
('ABC1235', cast('2016/01/01 11:30:00 AM' as datetime), null, 13),
('ABC1235', cast('2016/01/01 11:35:00 AM' as datetime), 50.00, 0),
('ABC1235', cast('2016/01/01 11:40:00 AM' as datetime), 50.00, 0),
('ABC1235', cast('2016/01/01 11:45:00 AM' as datetime), 50.00, 0),
('ABC1235', cast('2016/01/01 11:50:00 AM' as datetime), null, 16),
('ABC1235', cast('2016/01/01 11:55:00 AM' as datetime), null, 16),
('ABC1235', cast('2016/01/01 12:00:00 PM' as datetime), 50.00, 0),
('ABC1235', cast('2016/01/01 12:05:00 PM' as datetime), null, 17),
('ABC1235', cast('2016/01/01 12:10:00 PM' as datetime), null, 17),
('ABC1235', cast('2016/01/01 12:15:00 PM' as datetime), null, 17),
('ABC1235', cast('2016/01/01 12:20:00 PM' as datetime), null, 17),
('ABC1235', cast('2016/01/01 12:25:00 PM' as datetime), null, 17),
('ABC1235', cast('2016/01/01 12:30:00 PM' as datetime), null, 17),
('ZYA4567', cast('2016/01/01 10:00:00 AM' as datetime), 50.00, 0),
('ZYA4567', cast('2016/01/01 10:05:00 AM' as datetime), 50.00, 0),
('ZYA4567', cast('2016/01/01 10:10:00 AM' as datetime), 50.00, 0),
('ZYA4567', cast('2016/01/01 10:15:00 AM' as datetime), null, 3),
('ZYA4567', cast('2016/01/01 10:20:00 AM' as datetime), null, 3),
('ZYA4567', cast('2016/01/01 10:25:00 AM' as datetime), null, 3),
('ZYA4567', cast('2016/01/01 10:30:00 AM' as datetime), null, 3),
('ZYA4567', cast('2016/01/01 10:35:00 AM' as datetime), 50.00, 0),
('ZYA4567', cast('2016/01/01 10:40:00 AM' as datetime), 50.00, 0),
('ZYA4567', cast('2016/01/01 10:45:00 AM' as datetime), 50.00, 0),
('ZYA4567', cast('2016/01/01 10:50:00 AM' as datetime), 50.00, 0),
('ZYA4567', cast('2016/01/01 10:55:00 AM' as datetime), 50.00, 0),
('ZYA4567', cast('2016/01/01 11:00:00 AM' as datetime), 50.00, 0),
('ZYA4567', cast('2016/01/01 11:05:00 AM' as datetime), null, 9),
('ZYA4567', cast('2016/01/01 11:10:00 AM' as datetime), null, 9),
('ZYA4567', cast('2016/01/01 11:15:00 AM' as datetime), 50.00, 0),
('ZYA4567', cast('2016/01/01 11:20:00 AM' as datetime), 50.00, 0),
('ZYA4567', cast('2016/01/01 11:25:00 AM' as datetime), 50.00, 0),
('ZYA4567', cast('2016/01/01 11:30:00 AM' as datetime), null, 12),
('ZYA4567', cast('2016/01/01 11:35:00 AM' as datetime), 50.00, 0),
('ZYA4567', cast('2016/01/01 11:40:00 AM' as datetime), 50.00, 0),
('ZYA4567', cast('2016/01/01 11:45:00 AM' as datetime), 50.00, 0),
('ZYA4567', cast('2016/01/01 11:50:00 AM' as datetime), null, 15),
('ZYA4567', cast('2016/01/01 11:55:00 AM' as datetime), null, 15),
('ZYA4567', cast('2016/01/01 12:00:00 PM' as datetime), 50.00, 0),
('ZYA4567', cast('2016/01/01 12:05:00 PM' as datetime), null, 16),
('ZYA4567', cast('2016/01/01 12:10:00 PM' as datetime), null, 16),
('ZYA4567', cast('2016/01/01 12:15:00 PM' as datetime), null, 16),
('ZYA4567', cast('2016/01/01 12:20:00 PM' as datetime), null, 16),
('ZYA4567', cast('2016/01/01 12:25:00 PM' as datetime), 40.00, 0),
('ZYA4567', cast('2016/01/01 12:30:00 PM' as datetime), 50.00, 0)

这是我用来针对这个数据集运行的 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)

                         });

【问题讨论】:

  • 所以您已经有 LINQ 来创建 GROUP BY?我想你的进步方式将取决于你是如何做到的,请参阅devkimchi.com/211/playing-group-by-and-having-clauses-with-linq 我们可以看到 LINQ 吗?
  • 你为什么不发布你做了什么。顺便说一句,LINQ 太宽泛了。 LINQ 到 Sql? LINQ 到实体?还是?
  • 我编辑了这个问题,添加了我目前所拥有的代码。谢谢。

标签: c# sql-server linq c#-4.0


【解决方案1】:

以下是您编写该查询的方法:

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 }

【讨论】:

    猜你喜欢
    • 2012-11-27
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    相关资源
    最近更新 更多