2012-02-09 62 views
1

我在我的項目中使用BLToolKit,我試圖讓這個工作。我不喜歡的是,我試圖平均一堆臨時的分鐘,但正在生成的select語句按分鐘分組,但隨後選擇原始時間。我認爲我正確地做了linq表達式(但是再次,我沒有得到我期望的結果)。 (這是C#,如果你在意)任何人都知道什麼是錯的?BLToolKit,Linq查詢,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 2012-02-10 15:30:40

回答

6

我發現

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

可以作爲這種情況下的解決方法。

將此函數應用於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查詢。首先轉換數據和第二分組結果:

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(); 

無論這個查詢運行一個SQL來完成這項工作:

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]