2

我的问题是基于 C# 中每个文档的属性及其子文档的属性选择 RavenDB 文档。假设我们有以下文件:

objekts/1:
  {
  "Code": "1",
  "Children": [
    {
      "Role": "A",
      "Place": "Here"
    },
    {
      "Role": "B",
      "Place": "There"
    }
  ]
}

objekts/2:
{
  "Code": "1",
  "Children": [
    {
      "Role": "A",
      "Place": "There"
    },
    {
      "Role": "B",
      "Place": "Here"
    }
  ]
}

如何在 C# 中制定查询以选择具有 Code == "1" 和至少一个具有 Role == "A" 和 Place == "There" 的子对象的对象?查询应解析为objekts/2.

另外,如何制定可以查询的相应 Raven 索引?

数据类

public class Child
{
    public string Role { get; set; }
    public string Place { get; set; }
}

public class Objekt
{
    public string Code { get; set; }
    public List<Child> Children { get; set; } 
}
4

1 回答 1

5

首先,我们将处理索引,注意子键的前缀是Children_(Raven 要求的):

public class Objekt_ByCodeAndChildren : AbstractIndexCreationTask<Objekt>
{
    public Objekt_ByCodeAndChildren()
    {
        Map = objekts => from objekt in objekts
                         from child in objekt.Children
                             select new
                             {
                                 objekt.Code,
                                 Children_Role = child.Role,
                                 Children_Place = child.Place
                             };
    }
}

查询本身:

session.Query<Objekt, Objekt_ByCodeAndChildren>()
    .Where(o => o.Code == "1" &&
        o.Children.Any(c => c.Role == "A" && c.Place == "There"));

此查询成功找到 ID 为 的文档,objekts/2因为子匹配o.Children.Any(c => c.Role == "A" && c.Place == "There"),所以需要在索引子键前面加上Children_(例如,Children_Role)。

另一种技术是查询索引键类型,并将结果转换为原始类型(例如Objekt):

// Index key representation of an Objekt
public class ObjektKey
{
    public string Code { get; set; }
    public string Role { get; set; }
    public string Place { get; set; }
}

// Query for ObjektKey instances, before finally transforming them to Objekt
session.Query<ObjektKey, Objekt_ByCodeAndChildren>()
            .Where(o => o.Code == "1" && o.Role == "A" && o.Place == "Here")
            .OfType<Objekt>()
于 2013-07-20T21:20:22.310 回答