我正在使用OrderBy,我已经发现我必须使用OrderBy作为最后一种方法,否则它将无效。 Distinct运算符不会授予它将保持原始值的顺序,或者如果我使用Include,它不能对子集合进行排序。
为什么我不应该总是持续使用Orderby,并且如果保留订单则不担心?
编辑: 一般来说,有什么理由,比如性能影响,为什么我不应该最后使用OrderBy。如果我使用EnityFramework查询数据库或仅查询某些集合,则不会遇到问题。
dbContext.EntityFramework.Distinct().OrderBy(o=> o.Something); // this will give me ordered result
dbContext.EntityFramework.OrderBy(o=> o.Something).Distinct().; // this will not, because Distinct doesnt preserve order.
让我们说我只想选择一个属性。
dbContext.EntityFramework.Select(o=> o.Selected).OrderBy(o=> o.Something);
如果我在选择一个房产后订购集合,订单会更快吗?所以在这种情况下我应该使用Order last。而我只是问是否有任何情况下作为最后一个命令进行排序?
答案 0 :(得分:2)
我有什么理由不做OrderBy总是持续
可能有理由使用OrderBy
作为最后一个声明。例如,sort属性可能不在结果中:
var result = context.Entities
.OrderBy(e => e.Date)
.Select(e => e.Name);
或者您希望排序的集合作为结果的一部分:
var result = context.Customers
.Select(c => new
{
Customer = c,
Orders = c.Orders.OrderBy(o => o.Date)
Address = c.Address
});
如果我在选择一个属性后订购集合,订单会更快吗?
您的示例显示您正在使用LINQ to Entities,因此这些语句将转换为SQL。你会注意到......
context.Entities
.OrderBy(e => e.Name)
.Select(e => e.Name)
......和......
context.Entities
.Select(e => e.Name)
.OrderBy(s => s)
...将生成完全相同的SQL。因此,OrderBy
两个职位之间没有本质区别。
如果我使用Entity Framework查询数据库或仅查询某些集合,那无关紧要。
嗯,确实很重要。例如,如果你这样做......
context.Entities
.OrderBy(e => e.Date)
.Select(e => e.Name)
.Distinct()
...您会注意到EF完全忽略了OrderBy
,并且名称的顺序是不可预测的。
但是,如果你这样做......
context.Entities
.AsEnumerable() // Continue as LINQ to objects
.OrderBy(e => e.Date)
.Select(e => e.Name)
.Distinct()
...您将看到排序顺序保留在不同的结果中。 LINQ to objects显然与LINQ to Entities有不同的策略。声明末尾的OrderBy
会使两个结果相等。
总结一下,我说作为拇指的规则,尝试在LINQ查询中尽可能晚地订购。这将产生最可预测的结果。
答案 1 :(得分:1)
我不知道你是否误解了Distinct
的含义。根据定义它确实:
使用默认的相等比较器来比较值,从序列中返回不同的元素。
因此,如果您有int
的列表,并且想删除重复的值,则使用Distinct
。 Distinct
使用默认的相等比较器,它通过将当前元素与下一个元素进行比较来进行比较。所以,你必须先排序才能得到预期的结果。
关于OrderBy
方法,事实上,它就是排序。因此,如果您想在使用后对某些内容进行排序并进行分类:
List<int> myNumbers = new List<int>{ 102, 2817, 82, 2, 1, 2, 1, 9, 4 };
排序和删除重复的数字
// returns 1, 2, 4, 9, 82, 102, 2817
var sortedUniques = myNumbers.OrderBy(n => n).Distinct();
删除重复的数字并排序
// returns 1, 1, 2, 2, 4, 9, 82, 102, 2817
// It occurs because the Distinct compares current number to the next one
var sortedUniques = myNumbers.Distinct().OrderBy(n => n);
只删除重复的数字
// returns 102, 2817, 82, 2, 1, 9, 4
var sortedUniques = myNumbers.Distinct().OrderBy(n => n);
只需排序
// returns 1, 1, 2, 2, 4, 9, 82, 102, 2817
var sortedUniques = myNumbers.Distinct().OrderBy(n => n);
我希望它可以帮助你\ o /