我正在使用以下查询语法
from table
where
where
orderby
orderby
第一个orderby是日期,第二个orderby是日期。我认为这会像orderby那样工作,但似乎正在做其他事情。
如何在不使用扩展语法的情况下使用上述语法进行排序。 (知道了)
orderby,orderby做了什么?
答案 0 :(得分:47)
如何使用上述语法而不使用扩展语法来执行命令。
在字段之间使用逗号:
orderby a, b
orderby,orderby做了什么?
当您连续两次使用orderby
时,元素在概念上将首先使用第一个orderby
进行排序,然后使用第二个orderby
再次排序。因为排序被定义为stable sort(与第二个orderby
绑定的对象将保持与使用第一个orderby
排序后相同的顺序,它实际上意味着:< / p>
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子句中,但顺序与您的预期相反。
答案 1 :(得分:8)
在Query Expression Syntax中执行ThenBy是直截了当的,只需用逗号和第二个语句跟随初始orderby:
// 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;
使用标准查询运算符(扩展方法)应用第二个orderby实际上将第二个orderby应用于包含第一个orderby的查询结果的结果。实际上,只有第二个orderby将适用,尽管你仍然会花费CPU时间来计算第一个订单。
这实际上直接在MSDN documentation中为Enumerable.OrderBy和Enumerable.ThenBy方法回答。
因为IOrderedEnumerable 继承自IEnumerable,你可以 调用OrderBy或OrderByDescending 调用OrderBy的结果, OrderByDescending,ThenBy或 ThenByDescending。这样做 介绍了一个新的主要订购 忽略了之前建立的 排序
答案 2 :(得分:8)
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
答案 3 :(得分:0)
theby的答案应该是这样的
命令1,2
我会把第2部分留给其他人。