Как отсортировать сетку объектов Linq на основе производного поля? - PullRequest
0 голосов
/ 16 февраля 2010

Я написал страницу, которая использует Linq для запроса к базе данных и связывает полученный IQueryable с сеткой данных. У меня есть частичный класс, который содержит дополнительные свойства, которые получают свои значения на основе других значений, полученных из базы данных.

Сортировка отлично работает на полях, которые фактически находятся в базе данных, но не для производных полей. Когда я пытаюсь выполнить сортировку в таком поле, я получаю сообщение об ошибке: «Элемент Trip.Difference» не поддерживает перевод в SQL.

Есть идеи, как разрешить сортировку по этим производным полям?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2010

Сначала вызовите ToEnumerable (), а затем добавьте OrderBy:

var q = (from a in mDataContext.Somethings()
        select a).ToEnumerable().OrderBy...
0 голосов
/ 16 февраля 2010

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

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

Самое простое решение - вызвать ToList() на IQueryable, прежде чем использовать его для сортировки и привязки данных, чтобы вы сортировали объекты в памяти, где свойства фактически доступны. ToList() преобразует ваш IQueryable в IEnumerable (через List<T>) и останавливает его повторный доступ к базе данных через LINQ to SQL.

Обычно это хороший шаблон проектирования - последнее, что вам нужно, - это чтобы пользователи вашего бизнес-уровня могли невольно выполнять произвольные запросы к вашей базе данных просто потому, что вы вернули IQueryable, где вы должны были вернуть IEnumerable .

...