Возможная ошибка / проблема linq - PullRequest
2 голосов
/ 21 февраля 2011

У меня была проблема с запросом LINQ сегодня, и после некоторой отладки я смог решить проблему, но мне кажется, что работа LINQ мне кажется ошибкой. Вот что у меня было:

var myitem = context
.items
.OrderByDescending(x => x.DateEdited)
.FirstOrDefault(x => x.fkId == myFkId && x.DateEdited < someDate);

В моей базе данных у меня есть таблица с некоторыми записями, и я хочу получить самую последнюю запись, которая старше, чем "someDate" и которая имеет определенный внешний ключ в столбце. Вышеуказанный запрос не сработал. Он возвращал самую старую запись с соответствующим внешним ключом. В итоге мне пришлось переписать мой запрос следующим образом, чтобы он заработал:

var myitem = context
.items
.Where(x => x.fkId == myFkId && x.DateEdited < someDate)
.OrderByDescending(x => x.DateEdited)
.FirstOrDefault();

В процессе отладки я обнаружил, что x.DateEdited

Кто-нибудь еще сталкивался с этой проблемой? Это ошибка или ожидаемая функциональность?

Ответы [ 2 ]

3 голосов
/ 21 февраля 2011

Даже если .OrderByDescending() возвращает IOrderedEnumerable, .FirstOrDefault() является ярлыком для. Where(), который возвращает только IEnumerable, который не гарантирует порядок.

По сути, добавление фильтране гарантирует порядок данных.Если вы посмотрите на сгенерированный SQL с первого раза, вы получите вложенный подрезультат из orderby, который затем снова будет отфильтрован.

1 голос
/ 21 февраля 2011

Как правило, если операция не определяет явно порядок вывода, вы не можете зависеть от результата в каком-либо конкретном порядке, пока не укажете / не примените его самостоятельно.

Если вы не знаете, что упорядочение промежуточного результата приведет к повышению производительности на следующем шаге алгоритма, нет причин для этого. Просто примените порядок как последний этап обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...