我刚开始使用 RavenDb。我想为火车时间表建模。每列火车在现实世界中都是这样描述的。
Train no: 123
Reda 07:00
Gdynia 07:30
Sopot 08:00
Train no: 555
Reda 08:00
Gdynia 08:30
Sopot 09:00
Train no: 666
Reda 08:00
Wejherowo 09:00
我想查询访问 A 站(不必从那个站开始)然后去 B 站(不必完成它在那里运行)并且没有在 08:00 之前从 A 站出发的火车。因此,对于上面的时间表,如果我在 08:00 要求从Reda
到到的火车,Gdynia
我会得到 555 号火车。如果我在 08:00 要求从Reda
到到的火车也是一样Sopot
的。但我不应该收到 666 路火车。
我在代码中这样建模。
public class Train
{
public string Id { get; set; }
public string Number { get; set; }
public string Description { get; set; }
public ICollection<Station> Stations { get; set; }
public Train()
{
Stations = new List<Station>();
}
}
public class Station
{
public string Name { get; set; }
public string DepartFrom { get; set; }
}
我第一次尝试查询它是这样的:
using (var documentStore = new DocumentStore { Url = "http://localhost:8080" })
{
documentStore.Initialize();
var session = documentStore.OpenSession();
var found = from train in session.Query<Train>()
where train.Stations.Any(s => s.Name == from)
&& train.Stations.Any(s => s.Name == to)
select train;
}
但是 && 不适用于嵌套集合。我发现只有|| 有效,那是因为 Lucene 的工作方式。我还发现这里有 Intersect 方法可以让我创建我想要的查询,但我无法在任何地方找到该扩展方法(我使用的是 RavenDB Stable v1.0 build 992)。这样做的方法是什么,我必须创建索引吗?它应该怎么看?