2017-04-13 49 views
0

我已经在XLAMIN的PCL中实现了领域。这工作正常,并且应该(数据正在存储和检索)。Realm C# - 空集合的LINQ

现在我正在构建越来越多的功能,我遇到了无法找到查询空集合的情况。

由于模型绑定的原因,我需要返回IRealmCollection<Customer>,所以我无法枚举,然后筛选出没有结实的项目。

任何想法如何使这种情况发生在IQueryable?

我试图

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我只需要有博客的客户。这是一个特定于领域的问题,需要与常规.NET问题不同的答案。 –

+0

您是否尝试过使用'realm.All ().Where(x => x.BlogEntries.Count> 0).ToList(); '? (我认为额外的右括号是一个错字) – Takarii

回答

0

遗憾的是不支持的境界Xamarin 1.2.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列表。我的建议是尝试一下,看看它是否满足您的使用情况。