c# - 按作为实体导航属性的字段排序 - Linq to Entity

标签 c# linq-to-entities sql-order-by navigation-properties

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

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

但是我继续了一点并做了以下事情:

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

但是为大约 50 条记录对 enumeratedUser 对象进行排序大约需要。 7秒

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

谢谢

编辑

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

最佳答案

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

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

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

即排序将在内存中完成。因此需要很长时间

编辑

看来是MySQL相关的问题

你可以尝试这样的事情。

        var users = from user in entities.users
                          join country in entities.Country on user.CountryId equals country.Id
                          orderby country.Name
                          select user;

关于c# - 按作为实体导航属性的字段排序 - Linq to Entity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6703726/

相关文章:

c# - AssemblyCleanup 未运行。

c# - LINQ - 在父子层次结构中全选

MySQL - 按字段排序,从特定值之后开始

MYSQL - 排序时间戳值按顺序升序,从最新到最旧?

C# 将 span 与 SocketAsyncEventArgs 结合使用

c# - Outlook 中 "Item Sent"上的事件

c# - HttpListener 与 HttpHandler 的困境

c# - Entity Framework 4 : How to turn a string into an object for . OrderBy(p => p.fieldname)?

c# - Linq ForEach() 不填充字段

Mysql 如何通过将查询字符串与全文搜索匹配来排序 MATCH AGAINST