2017-09-15 103 views
0

我是RavenDB的新手,我正在努力解决这个简单的问题。 我有一个拥有订阅集合的订阅者。我想通过订阅的字段进行搜索,并返回相关的订阅者。通过RavenDB中的嵌套集合元素查询条目

下面是简单的例子类:

public class Subscriber 
{ 
    public string Email { get; set; } 
    public string Name { get; set; } 
    public string Phone { get; set; } 

    public List<Subscription> Subscriptions { get; set; } 
} 

public class Subscription 
{ 
    public Guid Id { get; set; } 
    public string EventType { get; set; } 
} 

我试图让一个索引,因为它是在RavenDB文档说:

public class Subscriber_BySubscription : AbstractIndexCreationTask<Subscriber> 
    { 
     public Subscriber_BySubscription() 
     { 
      Map = subscribers => from subscriber in subscribers 
           from subscription in subscriber.Subscriptions 
           select new 
           { 
            subscription.EventType, 
            subscription.QueueName 
           }; 
     } 
    } 

但我不知道这是我需要什么,因为使用SelectContains收集查询不起作用。此外,代码看起来非常难看,我觉得这不是它应该如何的方式。

所以,我想通过EventType查询订阅,并有相应的订阅者作为结果。在LINQ中,它看起来是这样的:subscribers.Where(x => x.Subscriptions.Select(c => c.EventType).Contains(myEventType))

回答

1

管理做到这一点。这是正确的索引:

public class Subscriber_BySubscription : AbstractIndexCreationTask<Subscriber> 
    { 
     public class Result 
     { 
      public string EventType { get; set; } 
     } 

     public Subscriber_BySubscription() 
     { 
      Map = subscribers => from subscriber in subscribers 
           from subscription in subscriber.Subscriptions 
           select new 
           { 
            subscription.EventType 
           }; 
     } 
    } 

这就是它应如何使用:

var results = uow.Session 
    .Query<Subscriber_BySubscription.Result, Subscriber_BySubscription>() 
    .Where(x => x.EventType == eventType) 
    .OfType<Subscriber>() 
    .ToList(); 
+0

请注意,这会更好: '地图=用户=>从用户在用户 选择新 {EventType = subscriber.Subscriptions.Select(x => x.EventType) };' 这会为每个文档生成一个值,从而避免扇出 –