按字段排序,该字段是实体的导航属性-按实体排序

本文关键字:实体 排序 字段 导航 属性 | 更新日期: 2023-09-27 18:02:23

我有一个场景,需要在列上按顺序排序,列是EF模型中Users实体的导航属性。

实体:用户-->国家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将上述SQL查询复制到实体,如下所示-(启用了Lazy Loading(

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,而不是MSSQL。事实上,我只是在MS SQL中的一个复制数据库上尝试了同样的查询,查询效果很好,即国家名称的顺序正确,所以除了从MySQL中获取结果集并通过可枚举对象上的内存执行顺序外,我似乎别无选择

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

这是对对象的LINQ,而不是对实体的LINQ。

上面的OrderBy子句将调用在可枚举中定义的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;

按字段排序,该字段是实体的导航属性-按实体排序

entitys.users.OrderBy(field=>field.country.Name(.ToList((;

但此查询不会返回按本国名称排序的国家上面的SQL查询确实如此。

是,不返回Countries,只返回按国家名称排序的Users当执行此查询时,将向DB发送以下sql。

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

正如您所看到的,结果不包括countries的任何字段。正如您提到的延迟加载,countires在需要时通过它进行加载。此时,countries按照您通过延迟加载调用的顺序进行排序。可以通过实体集的"Local"属性访问countries

这一点告诉您,如果您希望usercountry的名称排序,也希望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;

您尝试过使用Include吗?

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

解决方案

由于我在国家和用户表中都有名为Name的列,MySQL连接器在按国家排序时生成了此输出。已执行名称:

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

因此,这将导致用户订购。更确切地说是国家。名称

然而,MySQL发布了6.4.3.NET连接器版本,解决了一系列问题,其中之一是:

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

感谢您的投入。我尽可能清楚地帮助其他可能遇到我同样问题的人。