Sqlite PCL和Linq - 是SQLite.Net Table方法将整个表加载到集合中吗?

Dan*_*iel 6 c# linq sqlite windows-phone-8

我是一个构建Windows Phone 8的应用程序.我决定在便携式库中使用Sqlite PCL来缓存一些数据.

我没有在互联网上找到最近的信息我是否可以在桌子上使用linq.

我当然可以这样做

var phones = db.Table<PhoneNumber>().Where(x => some condition).ToList();
Run Code Online (Sandbox Code Playgroud)

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

我的问题是:我是否通过执行此操作检索所有电话号码,然后使用Linq过滤项目?或者linq在返回之前直接在sql命令中过滤项目?

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

第二个问题:我使用时是否相同FirstOrDefault

Dan*_*iel 7

显然,它并不那么明显.我刚刚在这里发现了一个非常有趣的论坛帖子

总而言之,如果你这样做

var whereFirstOrDefault = Table<AlertType>().Where(a => a.Name.Equals(alertType.Name)).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

这与此非常不同

var firstOrDefault = table.FirstOrDefault(a=> a.Name.Equals(alertType.Name));
Run Code Online (Sandbox Code Playgroud)

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

select * from "AlertType" where ("Name" = (?)) limit 1
Run Code Online (Sandbox Code Playgroud)

但是,第二个查询是:

select * from "AlertType"
Run Code Online (Sandbox Code Playgroud)

如上所述,

"SQLite.TableQuery有一个'Where'的扩展方法,它采用谓词."

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

"但SQLite.TableQuery只有一个不带参数的FirstOrDefault:"

这意味着,如果你使用FirstOrDefault谓词,它将检索整个表,但如果你在tablequery上没有谓词的情况下使用它,它将修改sql语句

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