LINQ OrderBy().ThenBy() 不工作

Posted

技术标签:

【中文标题】LINQ OrderBy().ThenBy() 不工作【英文标题】:LINQ OrderBy().ThenBy() not working 【发布时间】:2014-03-04 11:18:26 【问题描述】:

我正在将我的一个项目从使用基于 SQL Server 的实体框架模型转换为使用本地 SQLite 数据库。到目前为止一切进展顺利,但由于某种原因,我无法对多列的查询进行排序。例如:

using (var db = new SQLiteConnection("test3.db"))

    var query = from a in db.Table<Account>()
        where a.Inactive == false
        orderby a.AccountName, a.AccountNickname
        select a;
    foreach (var account in query)
    
        accounts.Add(account);                    
    

AccountsGrid.ItemsSource = accounts;

给我错误Cannot resolve symbol 'ThenBy',但如果我将排序更改为:

orderby a.AccountName

然后查询工作正常。我也尝试过使用.OrderBy(a =&gt; a.AccountName).ThenBy(a =&gt; a.AccountNickname),但我得到了同样的错误。我已经包含了using System.Linq;,但是 ReSharper 告诉我 using 指令不是必需的,所以这看起来也很可疑。有谁知道我可能会错过什么?

【问题讨论】:

db.Table&lt;Account&gt;() 输入什么? 我认为这可能与我正在使用的 SQLite 包装器有关。与其使用 .OrderBy() 的 System.Linq 实现,不如使用它自己的实现。我正在使用 sqlite-net。 @Grundy, db.Table&lt;Account&gt;() 是从数据库返回的Account 对象的底层 SQLite 表。 我很惊讶你可以像这样打电话给db.Table&lt;Account&gt;。查看 LinqConnect 文档,我预计它需要一个上下文类...... Table 方法在哪里定义? (如果你将鼠标悬停在它上面,它应该会说明它是否是扩展方法。) 您可以尝试添加System.Linq命名空间并将db.Table&lt;Account&gt;()更改为db.Table&lt;Account&gt;().AsQueryable()db.Table&lt;Account&gt;().AsEnumerable() 【参考方案1】:

看了the source,好像作者对LINQ理解不透:

他们没有提供ThenBy 方法,而是通过多个OrderBy 调用来收集多个订单 他们没有将表公开为 IQueryable&lt;T&gt; 实现(这就是为什么您不需要 using System.Linq) - 虽然这是一种有效方法,但它是一种非常不寻常的方法

我个人会对使用它感到非常紧张——事实上它被“组织”为三个巨大的源文件,这也有点令人担忧。您可能想尝试改用LinqConnect - 尽管我也没有使用过。

如果您确实想要坚持使用您正在使用的实现,我怀疑这会起作用 - 但它不适用于其他 LINQ 提供程序:

var query = from a in db.Table<Account>()
    where a.Inactive == false
    orderby a.AccountName
    orderby a.AccountNickname // Warning! Not portable!
    select a;

通常有两个像这样的orderby 调用将是一个非常非常糟糕的主意 - 但在这种情况下这似乎是 LINQ 提供者想要的。

【讨论】:

我之前使用的是 SQLite 开发团队的System.Data.SQLite nuget 包,但它似乎没有那么灵活。当我遇到sqlite-net这个项目时,它似乎对用户更友好,但也许我没有给官方一个足够好的机会。我也会研究 LinqConnect!谢谢。 有没有办法查看包中可用的方法?我正在尝试使用System.Data.SQLite 包而不是我目前使用的sqlite-net 包来确定我想要实现的目标是否可行。之前在使用System.Data.SQLite的时候,做任何事情都比较乏味,但我可能只是不知道它的能力。 @dubstylee:基本上,您需要尝试查找文档。当然,您也可以只使用 Intellisense 来探索 API。 我只是想让你知道,我今天试了一下 LinqConnect,它比我之前使用的 sqlite-net 有了飞跃式的发展。据我所知,它支持完整的类似 LINQ 的行为。谢谢提示!【参考方案2】:
    In Linq Query

var query = (from a in db.Table<Account>()
            where a.Inactive == false
            orderby a.AccountName ascending, a.AccountNickname descending
            select m);

      In Lambda Expression

var query = db.Table<Account>().where(a => a.Inactive == false).OrderBy(a => a.AccountName).ThenByDescending(a =>a.AccountNickname);

【讨论】:

这根本没有回答问题,你只是展示了两个等价的表达方式。

以上是关于LINQ OrderBy().ThenBy() 不工作的主要内容,如果未能解决你的问题,请参考以下文章

Linq 基本操作

不使用 lambda 表达式时的 LINQ 多重排序 [重复]

LINQ 学习路程 -- 查询操作 OrderBy & OrderByDescending

LINQ操作符四:排序操作符

C# LINQ

Linq多字段排序