2017-09-15 163 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) };' 這會爲每個文檔生成一個值,從而避免扇出 –