【问题标题】:Select N Random Records from SQLite C#从 SQLite C# 中选择 N 个随机记录
【发布时间】:2018-11-28 16:06:42
【问题描述】:

我想从包含 100 条记录的 SQLite 表中选择 20 条随机记录。

这是我的代码,我收到以下错误。 $exception {"Order By 不支持:x => NewGuid()"} System.NotSupportedException

int tempRun = 10;
        var dbPath = Path.Combine("OPS.db");
        using (var db = new SQLite.SQLiteConnection(dbPath))
        {
            var rec = db.Table<CoversData>().Where(p => p.homeR >= tempRun).Take(15);

            var randomrec = db.Table<CoversData>().OrderBy(x => Guid.NewGuid()).Take(15);
            // error {"Order By does not support: x => NewGuid()"}  System.NotSupportedException

            foreach (CoversData cd in rec)
            {
                ResultsListBox.Items.Add(cd.Id.ToString() + "  " + cd.GameDate + "  " + cd.HometeamName + "  " + cd.homeR.ToString());
            }
        }

答案应该是使用 Linq 格式而不是 SQL Select 语句。

【问题讨论】:

  • 请发布完整的异常信息。
  • db 是一个 SQLiteConnection - 你将如何订购一个连接实例?
  • 你是说"var randomrec = db.Table().OrderBy(x => Guid.NewGuid()).Take(15);"
  • 我更改了代码并发布了错误消息。
  • SQLite - ORDER BY RAND()的可能重复

标签: c# linq sqlite


【解决方案1】:

SQLiteConnection 类的 Table() 方法返回一个 TableQuery; - 见http://www.rbdocumentation.com/html/8594fc64-ce81-faa6-1472-25dcdb59a1ce.htm

NewGuid 不支持的异常是由于 OrderBy 被视为 SQLite 查询命令 - 创建新的 Guid 实例是在 .Net 应用程序级别完成的,它不是 SQLite 函数。

由于您的表中只有 100 条记录,您可以尝试读取所有表数据,然后在应用程序级别对结果进行排序。类似的东西:

 var randomrec = db.Table<CoversData>().ToList().OrderBy(x => Guid.NewGuid()).Take(15);

 var randomrec = db.Table<CoversData>().Where(x => true).OrderBy(x => Guid.NewGuid()).Take(15);

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    相关资源
    最近更新 更多