以下基本的LINQ to SQL语句不会导致orderby工作。正如您在T-SQL中看到的那样,没有orderby。你知道为什么吗?
LINQ to SQL:
var results = (from stats in db.t_harvest_statistics
orderby stats.unit_number
select stats.unit_number).Distinct().ToList();
以下TSQL结果
SELECT
[Distinct1].[unit_number] AS [unit_number]
FROM ( SELECT DISTINCT
[Extent1].[unit_number] AS [unit_number]
FROM [dbo].[t_harvest_statistics] AS [Extent1]
) AS [Distinct1]
答案 0 :(得分:28)
这是ORDER BY与DISTINCT相关的SQL和关系代数的限制。
ORDER BY必须在SQL中“进一步”(在“顶层”),因为它是视图操作。虽然一个可以编写具有ORDER BY“进一步”的SQL,但与RA操作相关,它通常会导致未定义的行为(有时会起作用)。从这个角度来看,Linq2Sql 可以自由地忽略 ORDER BY是有意义的,虽然也许一个例外会更好......反正它会不那么微妙;-)(实际上,同样的问题也存在于任何 Linq提供程序,它不提供“更严格”的Distinct定义。)
删除Distinct()
,Linq2Sql应该再次按预期生成ORDER BY。解决方案只是切换操作顺序,以便ORDER BY再次处于“顶级”。
文章Use of Distinct and OrderBy in LINQ涵盖了这一点:
这种行为可能看起来很奇怪。 问题是Distinct运算符没有授予它将保持原始值的顺序。应用于LINQ to SQL,这意味着在queryA等查询的情况下可以忽略排序约束
解决方案非常简单:将OrderBy运算符放在Distinct运算符后面,如下面的queryB定义:
var queryB = (from o in db.Orders select o.Employee.LastName) .Distinct().OrderBy( n => n );
快乐的编码。
答案 1 :(得分:0)
我在从事务表中排序年份时遇到了同样的问题。
试试这个
var results = (from stats in db.t_harvest_statistics
select stats.unit_number).Distinct().OrderBy(x =(Int16)x.unit_number).ToList();
获取明确的值后使用orderby方法