1

我刚开始使用 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)。这样做的方法是什么,我必须创建索引吗?它应该怎么看?

4

0 回答 0