修改LINQ查询的排序顺序

jos*_*shb 4 linq

我期望以下LINQ查询根据FirstName排序,但OrderBy扩展方法似乎没有效果.

DataClassesDataContext dc = new DataClassesDataContext();

var query = from contact in dc.Contacts
            select contact;

query.OrderBy(c => c.FirstName);
Run Code Online (Sandbox Code Playgroud)

当我在初始查询定义中包含orderby时,一切正常,但我希望能够在我的代码中稍后根据条件对其进行修改.

知道为什么这不起作用吗?

Mik*_*Two 11

尝试使用

query = query.OrderBy(c => c.FirstName);
Run Code Online (Sandbox Code Playgroud)

要么

var sortedQuery = query.OrderBy(c => c.FirstName);
Run Code Online (Sandbox Code Playgroud)

OrderBy创建一个新序列.


Jar*_*Par 7

问题是OrderBy没有修改现有的查询.相反,它正在创建一个新查询,用于对查询中的值进行排序.您需要捕获此结果

var sortedQuery = query.OrderBy(c => c.FirstName);
Run Code Online (Sandbox Code Playgroud)

几乎每个LINQ运算符都是如此.实际上并没有修改有问题的查询.相反,他们将查询结果过滤或投影到新的查询值中,并从方法中返回.


tva*_*son 7

除了@Mike Two的回复之外,请记住要有多种排序,你需要在最初的OrderBy之后使用它然后才能使用它,否则你只需要替换第一个排序.

var query = from contact in dc.Contacts
        select contact;

query = query.OrderBy(c => c.FirstName); 
query = query.ThenBy(c => c.LastName);

foreach (var contact in query)
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

实际上,我的偏好是使用扩展方法将它们全部链接在一起,但显然如果你需要使它们成为有条件的,这将不起作用.

var query = dc.Contacts
              .OrderBy( c => c.FirstName )
              .ThenBy( c => c.LastName );

foreach (var contact in query)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)