C# linq order by 和 take
C# linq order by and take
我正在使用 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);
非常感谢!
是的,这两个查询将 return 不同的结果,如:
query.OrderByDescending(o => o.id).Take(15)
将对整个源查询进行排序,然后 return 对前 15 个项目进行排序。这将导致您正在使用的整个排序数据集中的前 15 个项目。
query.Take(15).OrderByDescending(o => o.id)
将获取查询中的前 15 个项目(按其当前顺序)并仅对前 15 个项目进行排序(因此这可能 不是 您想要的想要)。
这两个查询的区别在于,第一个查询将从 id
排序的列表中按降序生成前 15 个项目,而第二个查询将从 [=21] 排序的列表中获取前 15 个项目=]顺序,重新按id
降序排列,然后return返回给你。
由于 RDBMS 中的 "natural" 顺序不能保证在多个请求中保持相同,因此只有第一个查询会 return 一致的结果。事实上,第二个查询可能会在您每次调用时 return 完全不同的记录集。
如果您在内存中执行这两个查询的结果将是一致的。
使用 100 条记录的简单示例可以很容易地说明区别,其中 id
s 从 1 到 100(含),按 ID 升序排列。第一个查询将 return ID 为 100、99、98、...、86 的记录,而第二个查询将 return ID 为 15、14、13、...、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)
有点容易测试...
是的,非常喜欢。这是一种操作顺序类型的东西。
假设你有一个数据集
A
F
B
D
F
C
你做一个return query.Take(3).OrderBy(o => o.name);
你会得到
A
B
F
但是,如果你这样做 return query.OrderBy(o => o.name).Take(3);
那么你会得到
A
B
C
我正在使用 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);
非常感谢!
是的,这两个查询将 return 不同的结果,如:
query.OrderByDescending(o => o.id).Take(15)
将对整个源查询进行排序,然后 return 对前 15 个项目进行排序。这将导致您正在使用的整个排序数据集中的前 15 个项目。query.Take(15).OrderByDescending(o => o.id)
将获取查询中的前 15 个项目(按其当前顺序)并仅对前 15 个项目进行排序(因此这可能 不是 您想要的想要)。
这两个查询的区别在于,第一个查询将从 id
排序的列表中按降序生成前 15 个项目,而第二个查询将从 [=21] 排序的列表中获取前 15 个项目=]顺序,重新按id
降序排列,然后return返回给你。
由于 RDBMS 中的 "natural" 顺序不能保证在多个请求中保持相同,因此只有第一个查询会 return 一致的结果。事实上,第二个查询可能会在您每次调用时 return 完全不同的记录集。
如果您在内存中执行这两个查询的结果将是一致的。
使用 100 条记录的简单示例可以很容易地说明区别,其中 id
s 从 1 到 100(含),按 ID 升序排列。第一个查询将 return ID 为 100、99、98、...、86 的记录,而第二个查询将 return ID 为 15、14、13、...、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)
有点容易测试...
是的,非常喜欢。这是一种操作顺序类型的东西。
假设你有一个数据集
A
F
B
D
F
C
你做一个return query.Take(3).OrderBy(o => o.name);
你会得到
A
B
F
但是,如果你这样做 return query.OrderBy(o => o.name).Take(3);
那么你会得到
A
B
C