gpt4 book ai didi

RavenDb:查找 Actor X 未出演的电影

转载 作者:行者123 更新时间:2023-12-02 17:06:03 26 4
gpt4 key购买 nike

我是 RavenDb 新手,遇到了以下问题,这在 SQL 数据库中很容易解决,但在 RavenDb 中却不那么容易(看起来)。

鉴于我的类(class):

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

使用以下 map 索引查找莱昂纳多·迪卡普里奥出演的每一部电影非常简单且高效:

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;

但这只会给我一个异常(exception):

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

有人知道如何在 RavenDb 中以正确的方式实现这一点吗?

最佳答案

使用我的博客文章中描述的方法:

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

您可以使用 ActorId 数组创建索引:

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

然后您可以搜索电影中不包含您想要的 Actor 的地方:

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

关于RavenDb:查找 Actor X 未出演的电影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15589251/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com