我在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);
非常感谢!
答案 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)
很容易测试...