我有一个场景,我需要在一个列上进行排序,该列是我的 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 子句将调用 OrderBy在 Enumerable 中定义
即排序将在内存中完成。因此需要很长时间
编辑
看来是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/