2

我有一个场景,我需要在一个列上排序,该列是我的 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;

因此,我尝试使用 Linq to Entities 复制上述 SQL 查询,如下所示 - (启用了延迟加载)

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

但是此查询不会像上面的本地 SQL 查询那样返回按名称排序的我的国家/地区。

但是,我继续进行了更多操作并执行了以下操作:

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

但是在 enumeratedUser 对象上订购大约 50 条记录需要大约 50 条记录。7秒

有没有更好的方法来省略 Enumerable 并且不返回匿名类型?

谢谢

编辑

我只是忘了说 EF 提供程序是 MySQL 而不是 MS SQL。事实上,我只是在 MS SQL 中的复制数据库上尝试了相同的查询,并且查询工作正常,即国家名称的排序正确,所以看起来我除了从 MySQL 获取结果集并执行命令之外别无选择从可枚举对象的内存中

4

4 回答 4

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

这是 LINQ to Objects 而不是 LINQ to Entities。

上面的 Order By 子句将调用Enumerable中定义的OrderBy

也就是说,排序将在内存中完成。因此需要很长时间

编辑

它看起来像一个与 MySQL 相关的问题

你可以试试这样的。

        var users = from user in entities.users
                          join country in entities.Country on user.CountryId equals country.Id
                          orderby country.Name
                          select user;
于 2011-07-15T07:25:25.557 回答
3

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

但是此查询不会像上面的本地 SQL 查询那样返回按名称排序的我的国家/地区。

是的,它不会返回Countries,而是仅Users按国家/地区名称排序。 执行此查询时,会将以下 sql 发送到 DB。

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;
于 2011-07-15T08:41:58.700 回答
0

你试过使用Include吗?

entities.users.Include["country"].OrderBy(field => field.country.Name).ToList();
于 2011-07-15T07:17:45.610 回答
0

解决方案

由于我在 Country 和 Users 表中都有 Name 列,因此 MySQL 连接器在 order by country.Name 执行时生成了这个输出:

SELECT `Extent1`.`Username`,  `Extent1`.`Name`,  `Extent1`.`Surname`, `Extent1`.`CountryId`
FROM `users` AS `Extent1` INNER JOIN `countries` AS `Extent2` ON `Extent1`.`CountryId` = `Extent2`.`CountryId`
ORDER BY `Name` ASC

因此这将导致排序 users.Name 而不是 countries.Name

然而 MySQL 已经发布了 6.4.3 .NET 连接器,它解决了一系列问题,其中一个是:

我们还包括一些与我们的实体框架提供程序相关的 SQL 生成改进。来源: http: //forums.mysql.com/read.php?3,425992

感谢您的所有意见。我试图尽可能清楚地帮助其他可能遇到我同样问题的人。

于 2011-07-15T18:39:38.127 回答