C#linq命令并采取

时间:2018-01-17 15:56:33

标签: c# linq sql-order-by

我在C#linq。

中进行查询

选择并保存查询后,我必须对其进行排序,并采取15行...

var query = from a 
[...]
select new
{
    a.id,
    a.desc,
}
[...]

这样做有什么不同:

return query.OrderByDescending(o => o.id).Take(15);

这个?

return query.Take(15).OrderByDescending(o => o.id);

非常感谢!

4 个答案:

答案 0 :(得分:4)

是的,非常如此。它是一种操作类型的东西。

假设您有一个数据集

A
F
B
D
F
C

你做了return query.Take(3).OrderBy(o => o.name);你会得到

A
F
B

如果你做return query.OrderBy(o => o.name).Take(3);,那么你会得到

A
B
C

答案 1 :(得分:2)

两个查询之间的区别在于,第一个查询将按照id按降序排序的列表生成最初的15个项目,而第二个查询将采用"自然& #34;订购,按id降序重新排序,然后返回给您。

自"自然" RDBMS中的顺序不保证在多个请求中保持相同,只有第一个查询将返回一致的结果。事实上,每次调用时,第二个查询都可能返回完全不同的记录集。

如果您在内存中执行这两个查询,结果将保持一致。

这个差异很容易用100个记录来简单说明,其中id从1到100,包括在内,按ID按升序排序。第一个查询将返回ID为100,99,98,...,86的记录,而第二个查询将返回ID为15,14,13,...,1的记录。

答案 2 :(得分:1)

是的,这两个查询将返回不同的结果,如:

  • query.OrderByDescending(o => o.id).Take(15)将对整个源查询进行排序,然后返回前15个项目。这将导致您正在使用的整个排序数据集中的前15个项目。
  • query.Take(15).OrderByDescending(o => o.id)将获取查询中的前15个项目(按当前顺序排列),然后对前15个项目进行排序(因此这可能不是您想要的内容)。

答案 3 :(得分:1)

是。一个需要15并订购它们。另一个订购它们并且需要15个。

using System.Linq;

public static void Main(string[] args)
{
    var nums = Enumerable
        .Range(0, 50)
        .OrderBy(o => Guid.NewGuid().GetHashCode())  // poor mans shuffle
        .ToList(); 

    Console.WriteLine(string.Join(",", nums));

    Console.WriteLine(string.Join(",", nums.Take(15).OrderBy(i => i)));

    Console.WriteLine(string.Join(",", nums.OrderBy(i => i).Take(15)));

    Console.ReadLine();
}

输出:

6,32,22,18,9,11,5,33,0,24,1,42,38,30,21,20,23,2,36,8,15,12,29,47,46,19,49,44,4,3
    7,40,3,10,41,34,17,31,16,43,35,39,25,27,45,7,28,14,13,26,48

0,1,5,6,9,11,18,21,22,24,30,32,33,38,42 // nums.Take(15).OrderBy(i => i)

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14      // nums.OrderBy(i => i).Take(15)

很容易测试...