Linq to Entities 4.1 - групповой запрос силы упорядочения - PullRequest
3 голосов
/ 09 июня 2011

Я разрабатываю приложение, используя Entity Framework 4.1 Code First. Проблема в том, что когда я пытаюсь сгруппировать запрос, он автоматически добавляет заказ с помощью ключа группы, переопределяя предыдущие операторы orderby. Вот запрос:

using (var database = new Database())
{
    var query = from frame in database.Set<Frame>()
                orderby frame.DtStart, frame.DtStartMs
                group frame by frame.ReadoutID;
    Console.WriteLine(query.ToTraceString());
}

Когда я смотрю на сгенерированный sql (перехватывая объектный запрос dbquery), я получаю следующее:

SELECT
`Project2`.`devices_leituras_key`,
`Project2`.`C1`,
`Project2`.`devices_frames_key`,
`Project2`.`devices_key`,
`Project2`.`devices_leituras_key1`,
`Project2`.`devices_arquivos_key`,
`Project2`.`init_byte_arquivo`,
`Project2`.`dt_inicio`,
`Project2`.`dt_inicio_ms`,
`Project2`.`dt_fim`,
`Project2`.`dt_fim_ms`
FROM (SELECT
`Distinct1`.`devices_leituras_key`,
`Extent2`.`devices_frames_key`,
`Extent2`.`devices_key`,
`Extent2`.`devices_leituras_key` AS `devices_leituras_key1`,
`Extent2`.`devices_arquivos_key`,
`Extent2`.`init_byte_arquivo`,
`Extent2`.`dt_inicio`,
`Extent2`.`dt_inicio_ms`,
`Extent2`.`dt_fim`,
`Extent2`.`dt_fim_ms`,
CASE WHEN (`Extent2`.`devices_frames_key` IS  NULL) THEN (NULL)  ELSE (1) END AS `
C1`
FROM (SELECT DISTINCT
`Extent1`.`devices_leituras_key`
FROM `devices_frames` AS `Extent1`) AS `Distinct1` LEFT OUTER JOIN `devices_frames`
AS `Extent2` ON `Distinct1`.`devices_leituras_key` = `Extent2`.`devices_leituras_key
`) AS `Project2`
 ORDER BY
`devices_leituras_key` ASC,
`C1` ASC

Обратите внимание, что существует некоторая привязка между POCO кадра и таблицей, например, свойство "ReadoutID" и "devices_leituras_key". Однако поле C1 отсутствует в таблице.

Вопросы: Почему указанные упорядочения пропали (orderby frame.DtStart, frame.DtStartMs)? Почему в поле ReadoutID появился другой странный порядок полей (ORDER BY devices_leituras_key ASC, C1 ASC)?

Когда я удаляю группировку, исходный порядок применяется нормально.

Заранее спасибо

1 Ответ

1 голос
/ 09 июня 2011

LINQ-to-SQL и LINQ-to-Entities используют удаленную модель. Последовательности в запросе реализуют IQueryable и после компиляции преобразуются в операторы запросов из класса Queryable, известного как деревья выражений. Деревья выражений интерпретируются средой выполнения.

Измените порядок в вашем запросе, и вы будете в порядке:

using (var database = new Database())
{
    var query = from frame in database.Set<Frame>()
    group frame by frame.ReadoutID;
    orderby frame.DtStart, frame.DtStartMs

    Console.WriteLine(query.ToTraceString());
}
...