order的正确行为

本文关键字:order | 更新日期: 2023-09-27 18:10:28

我遇到了一些困扰我的事情,我想听听你对这件事的看法。结果表明,linq to sql和实体框架对连续order by的威胁不同。

下面的代码只是举个例子,我并不是说它有任何意义:

Linq to 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

正如你所看到的,Linq To Sql添加了所有请求的顺序,其中最后一个具有最高优先级(在我看来是正确的)。另一方面,实体框架只尊重最后一个顺序,而忽略所有其他顺序。

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

order的正确行为

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

当你使用LINQ到对象时,你应该看到OrderBy取代了以前的任何一个,所以对我来说,让数据驱动的LINQ发挥同样的作用更有意义。

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

我学到的是by的顺序是这样写的:

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

这样每个人都能清楚地看到顺序