SqlitePCL和Linq-IsSQLite.Net表方法将整个表加载到集合中

本文关键字:加载 集合 Linq-IsSQLite Net 方法 SqlitePCL | 更新日期: 2023-09-27 18:29:23

我正在构建一个windowsphone 8应用程序。我决定在可移植库中使用SqlitePCL来缓存一些数据。

我没有在网上找到最近关于我是否可以在桌子上使用linq的信息。

我当然可以做

var phones = db.Table<PhoneNumber>().Where(x => some condition).ToList();

如果我看一下Where语句的返回值,它就是一个TableQuery

我的问题是:我是不是通过这样做来检索所有的电话号码,然后使用Linq来过滤项目?还是linq在返回之前直接在sql命令中过滤项目?

在我看来,Linq直接过滤sql语句中的项,因为Where函数返回TableQuery,但我还没有找到任何确认。

第二个问题:当我使用FirstOrDefault时,它是一样的吗?

SqlitePCL和Linq-IsSQLite.Net表方法将整个表加载到集合中

显然,这并不明显。我刚刚在这里找到了一个非常有趣的论坛帖子

总之,如果你这样做

var whereFirstOrDefault = Table<AlertType>().Where(a => a.Name.Equals(alertType.Name)).FirstOrDefault();

这与进行非常不同

var firstOrDefault = table.FirstOrDefault(a=> a.Name.Equals(alertType.Name));

第一个查询生成此命令,并且不检索整个表:

select * from "AlertType" where ("Name" = (?)) limit 1

然而,第二个查询是:

select * from "AlertType"

如前所述,

"SQLite.TableQuery有一个'Where'的扩展方法,它接受谓语"

这意味着Linq将修改sql语句。

"但是SQLite.TableQuery只有一个FirstOrDefault参数:"

这意味着,如果您将FirstOrDefault与谓词一起使用,它将检索整个表,但如果您在表查询中使用它而不使用谓词,它将修改sql语句

"如果您用谓词调用FirstOrDefault(我的第二种方法),SQLite.NET选择整个表,然后使用LINQ To对象对内存中的集合执行FirstOrDefault。"