2017-04-13 25 views
0

私はXamarin用のPCLで実装された領域を持っています。これはうまく動作し、(データが格納され、取得される)必要があります。レルムC# - 空のコレクションのLINQ

私は空のコレクションを照会する方法を見つけることができないという状況に苦しんでいます。

モデルバインドのためにIRealmCollection<Customer>を返す必要があるため、列挙できず、ブログエントリがない項目をフィルタリングできません。

これをIQueryableでどのように行うことができますか?

私は残念ながらそれはレルムXamarin 1.2.0でサポートされていません

var realm = Realm.GetInstance(); 
var customers = realm.All<Customer>(); 
// errors out - only Realm-managed props can be used 
customers = customers.Where(x => x.BlogEntries.Count > 0)); 
// errors out - Any() is not supported 
customers = customers.Where(x => x.BlogEntries.Any()); 
// errors out - Datatype mismatch in comparison 
customers = customers.Where(x => x.BlogEntries != null); 
// errors out - Datatype mismatch in comparison 
customers = customers.Where(x => x.BlogEntries == default(IList<BlogEntries>)); 
+0

なぜ空のコレクションを照会しようとしますか?その空の場合、決して結果を出すことはありません。代わりに、コレクションが空の場合は修飾し、コレクションが存在する場合は無視します。コレクションは箱のように考えてください。あなたはボックスからアイテムを手に入れようとしますか、それとも最初に何かがあるかどうかチェックしますか? – Takarii

+0

@Takarii私はblogpostsを持っている顧客だけが必要です。これは、レルム固有の質問で、通常の.NET質問とは異なる回答が必要です。 –

+0

'realm.All ().Where(x => x.BlogEntries.Count> 0).ToList();のような単一行のクエリを試したことがありますか? '? (私は余分な閉じ括弧が誤字であると仮定します) – Takarii

答えて

0

を試してみました。あなたは何ができることは、問題を回避するために貧しい人のコレクションの通知を実装している:

public class MyViewModel 
{ 
    private IRealmCollection<BlogEntry> _blogEntries; 
    private IEnumerable<Customer> _customers; 

    public IEnumerable<Customer> Customers 
    { 
     get { return _customers; } 
     set { Set(ref _customers, value); } 
    } 

    public MyViewModel 
    { 
     Customers = realm.All<Customer>() 
         .AsEnumerable() 
         .Where(c => !c.BlogEntries.Any()) 
         .ToArray(); 

     _blogEntries = realm.All<BlogEntry>().AsRealmCollection(); 
     _blogEntries.CollectionChanged += (s, e) => 
     { 
      var updatedCustomers = realm.All<Customer>() 
             .AsEnumerable() 
             .Where(c => !c.BlogEntries.Any()) 
             .ToArray(); 

      if (!IsEquivalent(updatedCustomers, Customers)) 
      { 
       Customers = updatedCustomers; 
      } 
     }; 
    } 

    private bool IsEquivalent(Customer[] a, Customer[] b) 
    { 
     if (a.Length != b.Length) 
     { 
      return false; 
     } 

     for (var i = 0; i < a.Length; i++) 
     { 
      if (!a[i].Equals(b[i])) 
      { 
       return false; 
      } 
     } 

     return true; 
    } 
} 

我々は唯一のコレクションの変更通知を失うToArray()を呼び出すときに、私たちはレルムにブログエントリのコレクションを観察することによって、単純にそれらを実装するとし、何かが更新されている場合は単純なチェックを行います。あなたが気に入ったら、このソリューションを拡張してINotifyCollectionChangedのカスタム実装でラップしてバインドすることができます。次に、正しいコレクション変更イベントを発生させるためにいくつかのセマンティクスを適用することもできます(または、各変更に対して単純な.Resetを選択することもできます)。

パフォーマンスの問題に対処するために、RealmコレクションでToArrayを呼び出すとオブジェクトのプロパティが生成されないため、比較的安価です。幾分高価な操作は、Customerのすべてのオブジェクトを繰り返し処理し、そのBlogEntriesリストをチェックすることです。私のアドバイスは、試してみて、それがあなたのユースケースに満足できるかどうかを確認することです。

関連する問題