[英]Sqlite PCL and Linq - Is SQLite.Net Table method loading the entire table into a collection?
我是一個構建Windows Phone 8的應用程序。 我決定在便攜式庫中使用Sqlite PCL來緩存一些數據。
我沒有在互聯網上找到最近的信息我是否可以在桌面上使用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
與謂詞一起使用,它將檢索整個表,但如果你在tablequery上沒有謂詞的情況下使用它,它將修改sql語句
“如果你使用謂詞(我的第二種方法)調用FirstOrDefault,SQLite.NET會選擇整個表,然后使用LINQ To Objects對內存中的集合執行FirstOrDefault。”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.