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 => a.AccountName).ThenBy(a => a.AccountNickname)
,但我得到了同样的错误。我已经包含了using System.Linq;
,但是 ReSharper 告诉我 using 指令不是必需的,所以这看起来也很可疑。有谁知道我可能会错过什么?
【问题讨论】:
db.Table<Account>()
输入什么?
我认为这可能与我正在使用的 SQLite 包装器有关。与其使用 .OrderBy() 的 System.Linq
实现,不如使用它自己的实现。我正在使用 sqlite-net。
@Grundy, db.Table<Account>()
是从数据库返回的Account
对象的底层 SQLite 表。
我很惊讶你可以像这样打电话给db.Table<Account>
。查看 LinqConnect 文档,我预计它需要一个上下文类...... Table
方法在哪里定义? (如果你将鼠标悬停在它上面,它应该会说明它是否是扩展方法。)
您可以尝试添加System.Linq
命名空间并将db.Table<Account>()
更改为db.Table<Account>().AsQueryable()
或db.Table<Account>().AsEnumerable()
【参考方案1】:
看了the source,好像作者对LINQ理解不透:
他们没有提供ThenBy
方法,而是通过多个OrderBy
调用来收集多个订单
他们没有将表公开为 IQueryable<T>
实现(这就是为什么您不需要 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() 不工作的主要内容,如果未能解决你的问题,请参考以下文章
不使用 lambda 表达式时的 LINQ 多重排序 [重复]