【问题标题】:LINQ OrderBy().ThenBy() not workingLINQ OrderBy().ThenBy() 不工作
【发布时间】: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()

标签: c# sql linq sqlite


【解决方案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);

【讨论】:

  • 这根本没有回答问题,你只是展示了两个等价的表达方式。
猜你喜欢
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 2021-04-17
相关资源
最近更新 更多