如何在Linq

时间:2016-05-04 01:45:34

标签: linq

我正在使用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。而我只是问是否有任何情况下作为最后一个命令进行排序?

2 个答案:

答案 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的列表,并且想删除重复的值,则使用DistinctDistinct使用默认的相等比较器,它通过将当前元素与下一个元素进行比较来进行比较。所以,你必须先排序才能得到预期的结果。

关于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 /