使用linq对数据库中的字段进行排序

时间:2011-03-27 13:32:53

标签: c# .net linq

我需要在实际数据库中对查询结果进行排序(因此,每当我得到一些结果时,我都不必对其进行排序)。我可以用linq做到这一点吗?

4 个答案:

答案 0 :(得分:2)

数据库表本质上是无序的;这是不可能的。

相反,您可以使用带有ORDER BY子句的视图,或者在数据访问类中创建一个返回IOrderedQueryable<T>的属性。

答案 1 :(得分:2)

我会在这里稍微不同意(暂时)与人们说表没有排序。通常它们是,如果你在表上有一个聚簇索引(在具有这种概念的数据库中),或者你已经在索引上聚集了一个表(在具有这种不同但相关的概念的数据库中),那么“无序”选择正在进行按顺序检索结果。

然而,我的分歧只是暂时的,因为他们所说的是事情的真相。无序选择获得该顺序的结果这一事实纯粹是因为它将成为数据库最快的顺序。值得注意的是,数据库将足够智能,如果你有一个按id排序的表,那么你要求它选择按ID排序,它会知道它不需要重新排序。

因此理想情况下,群集应该在最常选择表的一个或多个列上完成,(但请注意,这包括在查询中将一个表连接到另一个表时使用的内部选择,因此主键通常是最好集群,即使它永远不构成查询排序的基础。)

需要特定订单的查询应始终明确要求该订单,即使它看起来很浪费,因为无序版本以相同的顺序结束 - 您不希望以最有效的方式存在为了让DB稍后采取行动,你不会因为明白而失去任何东西。

LINQ是否对数据库进行排序取决于它获取结果的方式。假设某些MyTable System.Data.Linq.Table<TEntity>TEntity类型的变量。然后:

from m in MyTable orderby m.Id select new {m.Id, m.Name}

将对数据库进行排序,将其转换为

SELECT Id, Name FROM MyTable ORDER BY MyTable.Id

然后在流从数据库进入时发出每个对象。但是:

from m in MyTable.AsEnumerable() orderby m.ID select new {m.Id, m.Name}

首先会做相当于:

SELECT * FROM MyTable

然后在内存中对它们进行排序,然后创建匿名对象,然后它们变得可用(以及其他明显的缺点,即使结果以相同的顺序排列,现在也会进行排序,因为它们不同数据库可以使用的先验知识在可能的情况下跳过排序,并且使用一些算法排序已经排序的数据具有更糟糕的性能。)

在这些情况下,前者明显优于后者,但这是一个相当简单的案例。在更复杂的情况下进行后一种形式可能是必要的或至少是理想的,并且当处理更复杂的情况时,也可能意外地做出不希望的后一种情况的等同物。值得尝试在程序员 - 分析部分中保持良好的观点,当Linq将处理数据库中的某些内容以及何时处理内存时。通过SQL事件探查器和/或在LinqPad中测试查询,检查为更复杂的查询生成的SQL通常是一个好主意。

答案 2 :(得分:1)

创建正确的索引,创建正确的查询,一切都会好的。

即使数据是“预先排序” - dbms也不知道这一点,它仍然会对数据进行排序(即使它已经被排序)。并且无法保证在执行查询数据库时将按顺序读取数据。

答案 3 :(得分:1)

SQL中的表没有排序的概念。最接近的是在SQL服务器上创建一个视图,并使用LINQ2SQL查询该视图。

使用适当的索引,速度会很好,尤其是在查询时不需要记住排序。