按字段排序,该字段是实体的导航属性-按实体排序
本文关键字:实体 排序 字段 导航 属性 | 更新日期: 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
。
这一点告诉您,如果您希望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;
您尝试过使用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
感谢您的投入。我尽可能清楚地帮助其他可能遇到我同样问题的人。