2014-11-05 77 views
6

我是一個建立一個Windows Phone 8應用程序。我決定在便攜庫中使用Sqlite PCL來緩存一些數據。Sqlite PCL和Linq - 是SQLite.Net表方法將整個表加載到集合?

我沒有在互聯網上找到最近的信息,我是否可以在桌子上使用或不使用LINQ。

當然,我能做到這一點

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

如果我看一看在Where語句的返回值,它是一個TableQuery

我的問題是:我是否通過這樣檢索所有電話號碼,然後使用Linq過濾這些項目? 或者linq在返回它們之前直接在sql命令中過濾項目?

在我看來,我咬咬牙說,LINQ的直接過濾項目中的sql語句作爲Where函數返回一個TableQuery,但我沒有發現任何的確認。

第二個問題:當我使用FirstOrDefault時是否一樣?

+0

'linq'是一種查詢語言,而不是語言的實現。您需要將您的'linq'查詢轉換爲'SQL',而最低限度爲'ORM'並帶有' LinqProvider'。你應該看看'LinqToSQL'' EntityFramework'和'nHibernate',作爲針對SQL數據庫的最流行的Linq實現,但你幾乎可以肯定地避免L2S。 – Aron 2014-11-05 10:46:19

回答

7

顯然,它並不那麼明顯。我剛剛發現了一個很有趣的版面發表here

總之,如果你這樣做

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 

但是,se COND查詢是:

select * from "AlertType" 

作爲mentionned,

「SQLite.TableQuery具有 '位置' 的擴展方法,這需要 謂詞」。

這意味着Linq將會修改sql語句。

「但SQLite.TableQuery只有一個FirstOrDefault不採取 參數:」

這意味着,如果你使用FirstOrDefault一個謂語,它會檢索整個表,但如果你不需要使用的謂詞上tablequery,它會修改SQL語句

「如果你調用FirstOrDefault與謂詞(我的第二種方法), SQLite.NET選擇整個表,然後使用LINQ到對象 對內存中的集合執行FirstOrDefault。「