Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq对数据库中的字段进行排序_C#_.net_Linq - Fatal编程技术网

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

C# 使用linq对数据库中的字段进行排序,c#,.net,linq,C#,.net,Linq,我需要在实际数据库中对查询结果进行排序(因此,我不必每次得到一些结果时都对其进行排序)。我能用linq做到这一点吗?数据库表本身就是无序的;这是不可能的 相反,您可以使用带有ORDER BY子句的视图,或者在数据访问类中创建一个属性,该属性返回一个IOrderedQueryable数据库表本质上是无序的;这是不可能的 相反,您可以使用带有ORDER BY子句的视图,或者在数据访问类中创建一个返回IOrderedQueryable的属性,创建适当的索引,创建适当的查询,一切都会好起来 即使数据是“

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

数据库表本身就是无序的;这是不可能的


相反,您可以使用带有
ORDER BY
子句的视图,或者在数据访问类中创建一个属性,该属性返回一个
IOrderedQueryable
数据库表本质上是无序的;这是不可能的


相反,您可以使用带有
ORDER BY
子句的视图,或者在数据访问类中创建一个返回
IOrderedQueryable
的属性,创建适当的索引,创建适当的查询,一切都会好起来


即使数据是“预排序”的,dbms也不知道这一点,它会对数据进行排序(即使数据已经排序)。而且不能保证在执行查询时,数据库会按顺序读取数据。

创建适当的索引,创建适当的查询,一切都会好起来


即使数据是“预排序”的,dbms也不知道这一点,它会对数据进行排序(即使数据已经排序)。而且不能保证在执行查询时,数据库将按顺序读取数据。

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


有了适当的索引,速度会很快,尤其是查询时不需要记住排序。

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


有了适当的索引,速度会很快,尤其是在查询时,你不需要记住排序。

我会稍微(暂时)不同意人们说表没有排序。通常是这样的,如果在表上有聚集索引(在具有这种概念的数据库中),或者在索引上有聚集表(在具有这种不同但相关概念的数据库中),则“无序”选择将按该顺序检索结果

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

因此,理想情况下,应在表最常被选择的一列或多列上进行聚类(但请注意,这包括在查询中将一个表连接到另一个表时使用的内部选择,因此通常主键是最好的聚类依据,即使它从未构成查询顺序的基础)

需要特定顺序的查询应该总是显式地要求该顺序,即使这看起来很浪费,因为无序版本以相同的顺序结束-您不想指望DB稍后采取行动的最有效方式,而且显式也不会损失任何东西

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

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 Profiler和/或在LinqPad中测试查询,检查为更复杂的查询生成的SQL通常是一个好主意。

我会稍微不同意(暂时)这里有人说表是不排序的。通常是这样,如果表上有一个聚集索引(在具有这种概念的数据库中)或表上有一个聚集索引(在具有这种不同但相关概念的数据库中),则“无序”选择将按该顺序检索结果

然而,我的分歧只是暂时的,因为他们所说的才是事实的真相。无序选择按该顺序获得结果的事实纯粹是因为这将是数据库放入结果的最快顺序。另外值得注意的是,如果您有一个按id和y排序的表,那么数据库将足够智能如果您要求it选择按id订购的产品,它将知道无需重新订购

因此,理想情况下,应在表最常被选择的一列或多列上进行聚类(但请注意,这包括在查询中将一个表连接到另一个表时使用的内部选择,因此通常主键是最好的聚类依据,即使它从未构成查询顺序的基础)

需要