BLToolKit, Linq Query, SQL Не то, что я ожидал

Я использую 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;

и результирующий запрос таков

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]

person XenoPuTtSs    schedule 09.02.2012    source источник
comment
Я думаю, что это ошибка с BLToolKit, потому что попытка сделать то же самое с другой версией bltoolkit приводит к совершенно другим результатам.   -  person XenoPuTtSs    schedule 10.02.2012


Ответы (2)


Я обнаружил, что

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();
person kam99    schedule 28.08.2013

У меня такая же проблема вчера. Сегодня нашел обходной путь. Идея состоит в том, чтобы написать 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]
person akava    schedule 02.05.2012