2016-08-26 16 views
1

次のデータはSQLにあり、C#でTSQLからLINQに変換する必要があります。T-SQLからLinqへ:グループ内でのDATTYPEの変換

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句に取り組む方法がわからないと、より具体的に集約

having datediff(minute, min(sampletime), max(sampletime)) >= 5 

を使用してC#でDateDiff関数をどのように扱うかこれは私がこれまで持っているものです。

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) 

         }); 
+1

ので、あなたはすでにGROUP BYを作成するためにLINQを持っていますか?私はあなたの進歩の手段は、あなたがそれをやったかどうかによって決まると思います。http://devkimchi.com/211/playing-group-by-and-having-clauses-with-linq/ LINQを見ることができますか? – Cato

+0

何をしたのですか?そして、btw、LINQは広すぎます。 LINQ to Sql?エンティティへのLINQ?または? –

+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 } 
関連する問題