Linq-to-sql orderby, затем
Я использую следующий синтаксис запроса
from table
where
where
orderby
orderby
Если первый порядок - дата, а второй - дата. Я бы предположил, что это будет работать, как orderby, но, похоже, делает что-то еще.
-
Как я могу сделать orderby, используя этот синтаксис без использования синтаксиса расширения. (Получил)
-
И что делает orderby, orderby do?
Ответы
Ответ 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 кому-то еще.