Упорядочить по полю, которое является свойством навигации для сущности - Linq to Entity - PullRequest
2 голосов
/ 15 июля 2011

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

Сущности: Пользователи -> Страны 1: nотношение

Простой запрос SQL будет выглядеть следующим образом:

SELECT UserId, u.Name, c.Name
FROM users u join countries c on u.CountryId = c.CountryId
ORDER BY c.Name asc;

Итак, я попытался повторить вышеупомянутый запрос SQL, используя Linq для сущностей, следующим образом - (Ленивая загрузка включена)

entities.users.OrderBy(field => field.country.Name).ToList();

Но этот запрос не возвращает мои страны, отсортированные по их имени, как это делает нативный SQL-запрос, приведенный выше.

Однако я продолжил немного больше и сделал следующее:

var enumeratedUsers = entities.users.AsEnumerable();
users = enumeratedUsers.OrderBy(fields => fields.country.Name).ToList();

Но заказ объекта enumeratedUser для примерно 50 записей занял ок.7 секунд

Есть ли лучший способ, как опустить Enumerable без возврата анонимного типа?

Спасибо

РЕДАКТИРОВАТЬ

Я просто забыл сказать, что провайдер EF - это MySQL, а не MS SQL.На самом деле я только что попробовал тот же запрос на реплицированной базе данных в MS SQL, и запрос работает нормально, т.е. название страны упорядочено правильно, поэтому, похоже, у меня нет другого выбора, кроме как получить набор результатов из MySQL и выполнить заказ с помощьюиз памяти на перечислимый объект

Ответы [ 4 ]

6 голосов
/ 15 июля 2011
var enumeratedUsers = entities.users.AsEnumerable();
users = enumeratedUsers.OrderBy(fields => fields.country.Name).ToList();

Это LINQ для объектов, а не LINQ для объектов.

Выше условия Order By вызовет OrderBy , определенный в Enumerable

То есть порядок будет сделан в памяти.Следовательно, это займет много времени

Редактировать

Это похоже на проблему, связанную с MySQL

Вы можете попробовать что-то вроде этого.

        var users = from user in entities.users
                          join country in entities.Country on user.CountryId equals country.Id
                          orderby country.Name
                          select user;
2 голосов
/ 15 июля 2011

entity.users.OrderBy (field => field.country.Name) .ToList ();

Но этот запрос не возвращает мои страны, отсортированные по названию как родные SQL запрос выше.

Да, он не возвращает Countries, а только Users, отсортированный по названию страны. Когда этот запрос выполняется, следующий БД отправляется в БД.

SELECT u.*
FROM users u join countries c on u.CountryId = c.CountryId
ORDER BY c.Name asc;

Как видите, результат не включает в себя поля countries. Как вы упомянули ленивую загрузку, countires загружается через нее при необходимости. В это время countries заказывается как заказ, который вы называете через ленивую загрузку. Вы можете получить доступ к countries через свойство Local набора сущностей.

Этот пункт говорит вам, что если вы хотите, чтобы user сортировалось по имени country, а также countires сортировалось по имени, вам нужно с нетерпением загружаться, так как @Dennis упоминается как:

entities.users.Include["country"].OrderBy(field => field.country.Name).ToList();

Это преобразуется в следующий sql.

SELECT u.*, c.*
FROM users u join countries c on u.CountryId = c.CountryId
ORDER BY c.Name asc;
0 голосов
/ 15 июля 2011

РЕШЕНИЕ

Так как у меня были оба столбца с именем Name в таблице "Страны и пользователи", MySQL Connector генерировал этот вывод при выполнении заказа по стране.

, следовательно, это приведет к упорядочению пользователей. Имя, а не страны. Имя

Однако MySQL имеет выпуск версии 6.4.3 .NET-разъем, который разрешил множество проблем, одна из которых:

Мы также включили некоторые улучшения генерации SQL, относящиеся к нашему провайдеру структуры сущностей. Источник: http://forums.mysql.com/read.php?3,425992

Спасибо за ваш вклад.Я старался быть максимально ясным, чтобы помочь другим, которые могут столкнуться с той же проблемой.

0 голосов
/ 15 июля 2011

Вы пробовали использовать Include?

entities.users.Include["country"].OrderBy(field => field.country.Name).ToList();
...