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
?
显然,它并不那么明显.我刚刚在这里发现了一个非常有趣的论坛帖子
总而言之,如果你这样做
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."