2012-02-09 10 views
1

私のプロジェクトでBLToolKitを使用していますが、これを動作させようとしていました。私が気に入らないのは、私は分の時間を平均してテンポを平均化しようとしていますが、分単位で生成されるselect文は元の時間を選択します。私は正しくlinq式をやっていると思う(しかし、私は期待どおりの結果を得ていない)。 (これはC#、あなたが気にしているなら)誰でも何がうまくいかないのか知っていますか?BLToolKit、Linq Query、SQL私が期待したものではない

    var test = (from r in db.SensorReadingRaws 
         where r.TimeLogged < DateTime.Now.AddMinutes(-2) 
         group r by new 
         { 
          Sensor = r.SensorNumber, 
          //group time down to the minute 
          Time = r.TimeLogged.AddSeconds(-1 * r.TimeLogged.Second).AddMilliseconds(-1 * r.TimeLogged.Millisecond) 
         } into grouped 
         select new SensorReading 
         { 
          SensorNumber = grouped.Key.Sensor, 
          TimeLogged = grouped.Key.Time, 
          Reading = (int)grouped.Average(x => x.Reading) 
         }).ToList(); 

      textBox1.Text = db.LastQuery; 

と結果のクエリは、私は昨日と同じ問題を持って、この

SELECT 
[r].[SensorNumber], 
[r].[TimeLogged], 
Avg([r].[Reading]) as [c1] 
FROM 
[SensorReadingRaw] [r] 
WHERE 
[r].[TimeLogged] < @p1 
GROUP BY 
[r].[SensorNumber], 
DateAdd(Millisecond, Convert(Float, -DatePart(Millisecond, [r].[TimeLogged])), DateAdd(Second, Convert(Float, -DatePart(Second, [r].[TimeLogged])), [r].[TimeLogged])), 
[r].[TimeLogged] 
+0

私はbltoolkitの異なるバージョンでこれと同じことをしようとしているので、それは、BLToolKitのバグであると思われます完全に異なる結果をもたらす。 – XenoPuTtSs

答えて

6

をこの場合の回避策です。

select文の必須のグループ化されたキープロパティにこの関数を適用すると、元のフィールドをグループ化/選択解除できます。

それは次のように見えることがあります。

_queryStore.Leads(). 
    GroupBy(x => new { 
     x.LeadDate.Hour, 
     x.LeadDate.Minute 
    }). 
    Select(x => new { 
     Hour = Sql.AsSql(x.Key.Hour), 
     Minute = Sql.AsSql(x.Key.Minute), 
     Count = x.Count() 
    }); 

をし、あなたの特定のケースでは:

    var test = (from r in db.SensorReadingRaws 
         where r.TimeLogged < DateTime.Now.AddMinutes(-2) 
         group r by new 
         { 
          Sensor = r.SensorNumber, 
          //group time down to the minute 
          Time = r.TimeLogged.AddSeconds(-1 * r.TimeLogged.Second).AddMilliseconds(-1 * r.TimeLogged.Millisecond) 
         } into grouped 
         select new SensorReading 
         { 
          SensorNumber = grouped.Key.Sensor, 
          TimeLogged = Sql.AsSql(grouped.Key.Time), 
          Reading = (int)grouped.Average(x => x.Reading) 
         }).ToList(); 
2

です。 今日、私は回避策を見つけました。この考え方は、2 linqクエリを書くことです。まず、データを変換し、2番目の結果をグループ化:

var bandAndDate = 
    (from r in repo.Entities 
    select new {Band = r.Score/33, r.StartTime.Date}); 

var examsByBandAndDay = 
    (from r in bandAndDate 
    group r by new {r.Band, r.Date } into g 
    select new { g.Key.Date, g.Key.Band, Count = g.Count() }).ToList(); 

どちらも、このクエリは仕事行う1つのSQLを実行します。私は

BLToolkit.Data.Linq.Sql.AsSql<T>(T obj) 

として使用することができることを発見し

SELECT 
    [t1].[c1] as [c11], 
    [t1].[c2] as [c21], 
    Count(*) as [c3] 
FROM 
(
    SELECT 
     [r].[Score]/33 as [c2], 
     Cast(Floor(Cast([r].[StartTime] as Float)) as DateTime) as [c1] 
    FROM 
     [Results] [r] 
) [t1] 
GROUP BY 
    [t1].[c2], 
    [t1].[c1] 
関連する問題