BLToolKit,Linq Query,SQL不是我的预期

Xen*_*tSs 1 linq bltoolkit

我在我的一个项目中使用BLToolKit,我试图让它工作.我不喜欢的是我试图将一堆临时值平均分到一分钟,但正在生成的select语句按分钟分组然后选择原始时间.我想我正在正确地做linq表达式(但话又说回来,我没有得到我期望的结果).(这是C#,如果你关心)任何人都知道出了什么问题?

                 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;
Run Code Online (Sandbox Code Playgroud)

结果查询就是这个

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]
Run Code Online (Sandbox Code Playgroud)

小智 6

我发现了

BLToolkit.Data.Linq.Sql.AsSql<T>(T obj)
Run Code Online (Sandbox Code Playgroud)

可以用作此案例的解决方法.

将此函数应用于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()
    });
Run Code Online (Sandbox Code Playgroud)

在您的特定情况下:

                 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();
Run Code Online (Sandbox Code Playgroud)