Linq-to-sql заказать по - PullRequest
30 голосов
/ 25 мая 2010

Я использую следующий синтаксис запроса

from table
where 
where
orderby 
orderby

Где первый заказ - дата, а второй - дата. Я бы предположил, что это сработает так же, как по порядку, но, похоже, делает что-то еще.

  1. Как я могу сделать заказ, используя вышеуказанный синтаксис без использования синтаксиса расширения. (Понял)

  2. А что делает заказ, заказ делает?

Ответы [ 4 ]

47 голосов
/ 25 мая 2010

Как я могу сделать заказ, используя указанный выше синтаксис без использования синтаксиса расширения.

Используйте запятую между полями:

orderby a, b

А что делает заказ, делает заказ?

Когда вы используете orderby дважды подряд, элементы концептуально сначала будут отсортированы с использованием первого orderby, а затем снова отсортированы с использованием второго orderby. Поскольку сортировка определяется как стабильная сортировка (объекты, связанные со вторым orderby, останутся в том же порядке, что и после сортировки с первым orderby, это фактически означает, что это:

var query = from x in l
            orderby x.A
            orderby x.B
            select x;

эквивалентно:

var query = from x in l
            orderby x.B, x.A
            select x;

В результате, orderby термины поменялись местами с того, что вы, вероятно, намеревались.

Тестирование с помощью LINQ to SQL

Это можно проверить, попробовав его в LINQ to SQL. Я создал следующий запрос:

var query = from a in dc.Orders
            orderby a.Date
            orderby a.CustomerID
            select a;

и это был сгенерированный SQL:

SELECT [t0].[ID], [t0].[CustomerID], [t0].[Date], [t0].[Description]
FROM [dbo].[Order] AS [t0]
ORDER BY [t0].[CustomerID], [t0].[Date]

Обратите внимание, что orderby a.Date не игнорируется. Оба условия включены в предложение ORDER BY, но в противоположном порядке, чем вы могли бы.

8 голосов
/ 13 июля 2012

Оператор ThenBy применяет вторичный, восходящий порядок сортировки к последовательности. Это похоже на применение вторичного порядка сортировки в T-SQL, например:

Select * from Customer order by FirstName,lastName

В linq мы можем написать это как:

var thenby = mode.CustList.Select(cus => new
        {
            cus. FirstName,
            cus. LastName,
            cus. EmailAddress
        }).OrderBy(cus => cus. FirstName).ThenBy(cus => cus. LastName);

Вы можете узнать больше об этом здесь: http://dotnetreaders.com/articles/ThenBy_in_LINQ_c-sharp,_Orderby_Thenby_in_LINQ_C-sharp/204

8 голосов
/ 26 мая 2010

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

// Create the data source.
List<Student> students = GetStudents();

// Create the query.
IEnumerable<Student> sortedStudents =
    from student in students
    orderby student.Last ascending, student.First ascending
    select student;

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

На самом деле на это есть ответ непосредственно в документации MSDN для методов Enumerable.OrderBy и Enumerable.ThenBy.

Потому что IOrderedEnumerable наследует от IEnumerable, вы можете вызвать OrderBy или OrderByDescending on результаты звонка в OrderBy, OrderByDescending, ThenBy или ThenByDescending. Делая это вводит новый первичный порядок, который игнорирует ранее установленное упорядоченность.

0 голосов
/ 25 мая 2010

Ответ на этот вопрос должен быть таким:

заказ 1, 2

Я оставлю часть №2 кому-то другому.

...