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
时,它是一样的吗?
显然,这并不明显。我刚刚在这里找到了一个非常有趣的论坛帖子
总之,如果你这样做
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。"