【发布时间】: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