Правильное поведение OrderBy - PullRequest
3 голосов
/ 03 октября 2011

Я столкнулся с чем-то, что озадачивает меня, и я хотел бы узнать ваше мнение по этому вопросу. Оказывается, что linq to sql и сущность каркаса угрожают последовательному порядку по-разному.

Следующий код используется только для примера, и я не утверждаю, что он вообще имеет какой-либо смысл:

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]

Тот же тест с Entity Framework генерирует это:

    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 добавляет все запрошенные ордера на те, где последний имеет наивысший приоритет (что, на мой взгляд, верно). С другой стороны, структура сущностей учитывает только последний порядок и игнорирует все остальные.

Теперь я знаю, что к тому моменту есть порядок, который можно использовать, но мне просто интересно, какое поведение является более правильным. Также, насколько я помню, расширители запросов, используемые в asp, работают с отдельным порядком, в соответствии с которым при применении к запросу, сгенерированному из другого источника данных, будет работать неправильно (в соответствии с приведенным выше примером один из порядков будет опущен)

Ответы [ 2 ]

5 голосов
/ 03 октября 2011

Мое мнение, что EF правильно.Я не знаю, почему L2S будет делать то, что вы описываете - по моему мнению, если вы добавите предложение OrderBy вместо ThenBy, оно должно перезаписать все существующие OrderBy s.

Когда вы работаете с Linq-To-Objects, вы должны увидеть, что OrderBy заменит все предыдущие, так что для меня более логично, чтобы управляемый данными LINQ действовал так же.

Если поведениеизменил способ, которым вы описываете, тогда, похоже, Microsoft согласна, так как EF был разработан, чтобы заменить L2S.

4 голосов
/ 03 октября 2011

Что я узнал, так это то, что порядок написан так:

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

И вот так вы можете видеть порядок, понятный каждому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...