Подтвердить что ты не робот

Linq-to-sql orderby, затем

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

from table
where 
where
orderby 
orderby

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

  • Как я могу сделать orderby, используя этот синтаксис без использования синтаксиса расширения. (Получил)

  • И что делает orderby, orderby do?

4b9b3361

Ответ 1

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

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

orderby a, b

И что делает orderby, orderby do?

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

Ответ 2

Выполнение функции 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. Делая это вводит новый первичный заказ, который игнорирует ранее установленные упорядочение.

Ответ 3

Оператор 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

Ответ 4

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

orderby 1, 2

Я оставлю часть №2 кому-то еще.