2013-03-23 42 views
3

我是RavenDb的新手,我遇到了以下問題,在SQL數據庫中很容易解決,但在RavenDb中看起來並不那麼容易。RavenDb:找到演員X不是代理的電影

由於我的課:

//document collection 
public class Movie 
{ 
    public string Id { get; set; } 
    public string Title { get; set; } 
    public List<MovieActor> Actors { get; set; } 
} 

public class MovieActor 
{ 
    public string ActorId { get; set; } 
    public string CharacterName { get; set; } 
    public DateTime FirstAppearance { get; set; } 
} 

//document collection 
public class Actor 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
} 

發現每部電影萊昂納多迪卡普里奧行事是非常容易和高效使用下列地圖索引:

public class Movies_ByActor : AbstractIndexCreationTask<Movie> 
{ 

    public Movies_ByActor() 
    { 
     Map = movies => from movie in movies 
         from actor in movie.Actors 
         select new 
         { 
          MovieId = movie.Id, 
          ActorId = actor.ActorId 
         }; 
    } 
} 

但這不是我想要的實現,我想相反...找到萊昂納多迪卡普里奧沒有采取行動的所有電影。

我也曾嘗試以下查詢:

var leonardoActorId = "actor/1"; 
var movies = from movie in RavenSession.Query<Movie>() 
       where !movie.Actors.Any(a => a.ActorId.Equals(leonardoActorId)) 
       select movie; 

但這隻會給我一個例外:

System.InvalidOperationException: Cannot process negated Any(), see RavenDB-732 http://issues.hibernatingrhinos.com/issue/RavenDB-732 

任何人都知道如何做到這一點的RavenDb的正確方法?

+0

這並不是說我對Lenoardo迪卡普里奧任何=) – 2013-03-23 17:11:13

回答

3

用在我的博客張貼在這裏介紹的方法:

http://www.philliphaydon.com/2012/01/18/ravendb-searching-across-multiple-properties/

您可以創建ActorIds數組的索引:

public class Movies_ByActor : AbstractIndexCreationTask<Movie> 
{ 
    public Movies_ByActor() 
    { 
     Map = movies => from s in movies 
         select new 
         { 
          Actors = s.Actors.Select(x => x.ActorId) 
         }; 
    } 

    public class ActorsInMovie 
    { 
     public object[] Actors { get; set; } 
    } 
} 

然後你就可以搜索那裏的電影沒有按」 t包含你想要的演員:

var result = session.Query<Movies_ByActor.ActorsInMovie, Movies_ByActor>() 
        .Where(x => x.Actors != (object)"actors/1") 
        .As<Movie>(); 

Sin當我們查詢的對象與結果不同時,我們需要指定As<T>來告訴RavenDB實際返回的對象的類型。

工作樣本:http://pastie.org/7092908

+1

要命,謝謝=) 這工作得很好,並幫助我理解相當多的。 只有,我不得不將查詢中的.WHER部分改爲: x =>!x.Actors.Contains((object)「actors/1」)) – 2013-03-23 20:10:21