C# OrderBy的正确行为

C# OrderBy的正确行为,c#,.net,linq,entity-framework,linq-to-sql,C#,.net,Linq,Entity Framework,Linq To Sql,我遇到了一些困扰我的事情,我想听听你对这件事的看法。事实证明,LINQtoSQL和实体框架对连续订单的威胁是不同的 以下代码仅用于示例,我并不认为它有任何意义: Linq到sql: DataClasses1DataContext db = new DataClasses1DataContext(); var result = (from c in db.Products orderby c.ProductName

我遇到了一些困扰我的事情,我想听听你对这件事的看法。事实证明,LINQtoSQL和实体框架对连续订单的威胁是不同的

以下代码仅用于示例,我并不认为它有任何意义:

Linq到sql:

DataClasses1DataContext db = new DataClasses1DataContext();
        var result = (from c in db.Products
                      orderby c.ProductName
                      orderby c.UnitPrice
                      orderby c.UnitsOnOrder
                      select c).ToList();
它在服务器端生成的内容:

SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
FROM [dbo].[Products] AS [t0]
ORDER BY [t0].[UnitsOnOrder], [t0].[UnitPrice], [t0].[ProductName]
使用实体框架进行的相同测试会生成以下内容:

    SELECT 
[Extent1].[ProductID] AS [ProductID], 
[Extent1].[ProductName] AS [ProductName], 
[Extent1].[SupplierID] AS [SupplierID], 
[Extent1].[CategoryID] AS [CategoryID], 
[Extent1].[QuantityPerUnit] AS [QuantityPerUnit], 
[Extent1].[UnitPrice] AS [UnitPrice], 
[Extent1].[UnitsInStock] AS [UnitsInStock], 
[Extent1].[UnitsOnOrder] AS [UnitsOnOrder], 
[Extent1].[ReorderLevel] AS [ReorderLevel], 
[Extent1].[Discontinued] AS [Discontinued]
FROM [dbo].[Products] AS [Extent1]
ORDER BY [Extent1].[UnitsOnOrder] ASC
正如您所看到的,LINQtoSQL添加了所有请求的ORDERBY,其中最后一个具有最高优先级(我认为这是正确的)。 另一方面,实体框架只尊重最后一个命令,而忽略所有其他命令


现在我知道有一个orderbythen子句可以使用,但我只是想知道哪个行为更正确。此外,据我记忆所及,asp中使用的查询扩展程序使用的是一个单独的顺序,如果应用于从不同数据源生成的查询,将无法正常工作(根据上面的示例,将省略一个order by)

我认为EF是正确的。我不知道L2S为什么会像你所描述的那样-在我看来,如果你添加一个
OrderBy
子句而不是使用
ThenBy
,它应该会覆盖任何现有的
OrderBy
s

当您使用Linq To对象时,应该会看到
OrderBy
替换以前的任何对象,因此让数据驱动的Linq也这样做对我来说更有意义


如果行为改变了您描述的方式,那么微软似乎同意了,因为EF的设计目的是取代L2S。

我学到的是,order by是这样写的:

DataClasses1DataContext db = new DataClasses1DataContext();
        var result = (from c in db.Products
                      orderby c.UnitsOnOrder, c.UnitPrice, c.ProductName
                      select c).ToList();

这样,您可以清楚地看到每个人的订单。

UnitsOrder是唯一的吗?看来这正是ThenBy的目的。组合更多的订购条件。所有其他的都会覆盖以前的orderby结构。这种orderby结构的问题仍然是,ASP.NET中的查询扩展程序将不同的orderby添加到现有查询中。因此,如果您已经存在的查询已经添加了另一个订单,那么来自查询扩展程序的订单将被忽略。现在我并不是说这一定是错的,但我真的很困惑。我不确定解决方案是什么——我个人认为ASP.NET不应该对查询产生任何影响,排序/过滤应该在数据层代码中明确完成。这使得ASP.NET只需按原样吐出数据,而不用在查询扩展程序中执行自己的自定义操作。你可以说我很守旧,但是你用代码而不是标记做的越多,就越容易实现你的目标——C#代码比微软不断添加的那些花哨的ASP.NET东西更容易编写和调试。漏洞的想法是简化事情。因此,查询扩展程序似乎无法与实体框架一起工作。别误会,我对手工编码很在行。。我一直在这么做,但我只是想知道。谢谢你的宝贵意见,乔!没问题-祝您的项目好运。这也是LINQ中首选的排序方式。orderby的这种结构的问题仍然是ASP.NET中的查询扩展程序将不同的orderby添加到您现有的查询中。因此,如果您已经存在的查询已经添加了另一个订单,那么来自查询扩展程序的订单将被忽略。现在我并不是说这一定是错的,但我真的很困惑。