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

Rya*_*yan 2 c# linq-to-entities sql-order-by navigation-properties

我有一个场景,我需要在一个列上订购,该列是我的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;
Run Code Online (Sandbox Code Playgroud)

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

entities.users.OrderBy(field => field.country.Name).ToList();
Run Code Online (Sandbox Code Playgroud)

但是这个查询不会返回按照上面的本机SQL查询按名称排序的国家/地区.

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

var enumeratedUsers = entities.users.AsEnumerable();
users = enumeratedUsers.OrderBy(fields => fields.country.Name).ToList();
Run Code Online (Sandbox Code Playgroud)

但是在enumeratedUser对象上排序约50条记录.7秒

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

谢谢

编辑

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

Era*_*nga 6

var enumeratedUsers = entities.users.AsEnumerable();
users = enumeratedUsers.OrderBy(fields => fields.country.Name).ToList();
Run Code Online (Sandbox Code Playgroud)

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

Above 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;
Run Code Online (Sandbox Code Playgroud)