3

私はRavenDbを初めて使用し、次の問題が発生しました。これはSQLデータベースでは非常に簡単に解決できますが、RavenDbではそれほど簡単ではありません(そうです)。

私のクラスを考えると:

//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でこれを適切な方法で実現する方法を知っている人はいますか?

4

1 に答える 1

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; }
    }
}

次に、映画に必要な俳優が含まれていない場所を検索できます。

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

クエリ対象のオブジェクトは結果とは異なるため、As<T>実際に返されるオブジェクトのタイプをRavenDBに通知するように指定する必要があります。

作業サンプル: http: //pastie.org/7092908

于 2013-03-23T18:53:18.003 に答える