2016-11-01 110 views
0

有沒有辦法限制從Realm Xamarin LINQ查詢返回的「列」?領域Xamarin LINQ選擇

舉例來說,如果我有一個Customer RealmObject,我希望所有客戶的名單,我必須查詢All<Customer>然後枚舉的結果來構建名稱列表?這看起來麻煩而且效率低下。我沒有看到文檔中的任何內容。我在這裏錯過了很明顯的東西嗎謝謝!

+0

只選擇名稱,不起作用爲什麼? – Marco

回答

1

你必須記住,Realm是一個基於對象的商店。在像Sqlite這樣的RDBMS中,將返回結果限制爲「記錄」的「列」的子集是有道理的,但在對象存儲中,您將從原始類中刪除屬性,從而創建一個新的動態類以然後將這些新類實例化爲對象。

因此是你想要的只是一個代表客戶的姓名,你可以做這個字符串列表:

List<string> names = theRealm.All<Customer>().ToList().Select(customer => customer.Name).ToList(); 

注:您採取Realm.All<>結果到List第一,然後使用一個LINQ Select「過濾器」只是你想要的屬性。目前不支持在RealmResults上直接使用.Select(​​)。

如果需要返回一個複雜類型,它是從原始RealObject屬性的子集,假設你有一個匹配的POCO,您可以使用:

var custNames = theRealm.All<Customer>().ToList().Select((Customer c) => new Name() { firstName = c.firstName, lastName = c.lastName }); 

記住,一旦你轉換RealmResult到使用RealmObject s的POCO靜態列表會丟失活動性

個人而言,我避免這樣做盡可能的境界是如此之快,使用RealmResult,因此RealObject小號是直接在處理時間和內存開銷,然後將那些波蘇斯每次你需要新的列表更有效...

+0

只是爲了建立起來,有很少的情況下,你會想要獲得領域對象的屬性的子集(我想,發送到服務器或建立一個串聯的字符串)。在大多數情況下,您可以使用完整的'Customer'對象,由'All '返回,沒有任何性能影響。 –

+0

@NikolaIrinchev完全同意,如果連接字符串的情況下使用First和Last名稱,則使用只在RealmObject中標記爲[[Ignored]]的readonly屬性來執行級聯操作,這比執行First +姓氏到字符串或POCO的「列表」.... – SushiHangover