查询RavenDB中的嵌套字典

时间:2011-08-13 11:55:42

标签: indexing nested ravendb dictionary

这个问题涉及查询嵌套词典。

我有一个案例可以简化为以下设置,其中包含一个包含Collis列表的SKU列表。

CLASS DEFINITIONS:

public class Style
{
    public string Name { get; set; }
    public Dictionary<string, Sku> Skus = new Dictionary<string, Sku>();
}
public class Sku
{
    public string Name { get; set; }
    public Dictionary<string, Colli> Collis = new Dictionary<string, Colli>();
}
public class Colli
{
    public string Name { get; set; }
}

RAVEN DB中的JSON数据:

{
 "Skus": {
    "Sku1": {
      "Collis": {
        "Right": {
          "Name": "Right"
        },
        "Right again": {
          "Name": "Right again"
        },
        "Wrong": {
          "Name": "Wrong"
        }
      },
      "Name": "Sku1"
    },
    "Sku2": {
      "Collis": {
        "Wrong 1": {
          "Name": "Wrong 1"
        },
        "Wrong 2": {
          "Name": "Wrong 2"
        },
        "Wrong 3": {
          "Name": "Wrong 3"
        }
      },
      "Name": "Sku2"
    }
  },
  "Name": "Style1"
}

有效查询:

(询问带有特定名称skus的样式)

var existingStyleWithSku1 = session.Query<Style>().Where(s => s.Skus["Sku1"] != null).ToList();
var nonexistingStyleWithSku4 = session.Query<Style>().Where(s => s.Skus["Sku4"] != null).ToList();

无效嵌套查询

(询问包含名为“Sku1”的sku的样式,其中包含名为“Right”的colli)

var styleWithSpecificColli = session.Query<Style>().Where(s => s.Skus["Sku1"].Collis["Right"] != null).ToList();

当我尝试执行最后一个查询时,收到消息:

  

{“Url”:   “/indexes/dynamic/Styles?query=-Skus.get_Item(%2522Sku1%2522).Collis.Right%253A%255B%255BNULL_VALUE%255D%255D%2520AND%2520Skus.get_Item(%2522Sku1%2522).Collis.Right %253A *安培;开始= 0&安培;的pageSize = 128&安培;聚集=无”,   “错误”:“System.ArgumentException:字段')CollisRight'不是   indexed,无法查询未编入索引的字段\ r \ n at   Raven.Database.Indexing.Index.IndexQueryOperation.AssertQueryDoesNotContainFieldsThatAreNotIndexes()   在c:\ Builds \ raven \ Raven.Database \ Indexing \ Index.cs:第628行\ r \ n   在   Raven.Database.Indexing.Index.IndexQueryOperation.d__1c.MoveNext()   在c:\ Builds \ raven \ Raven.Database \ Indexing \ Index.cs:第542行\ r \ n   在   System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext()\r\n at System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext(个)\ r \ n   在System.Collections.Generic.List 1.InsertRange(Int32 index, IEnumerable 1集合)\ r \ n at   ........

有没有办法让我能够执行上一个查询?也许定义在RavenDB中索引的内容?

提前谢谢你。

1 个答案:

答案 0 :(得分:3)

我将上面的示例发布为测试失败,但是synhershko更正了我的代码以使其正常工作。

实际上可以这样做。该查询恰好如下所示:

<强> WRONG:

var styleWithSpecificColli = session.Query<Style>()
.Where(s => s.Skus["Sku1"].Collis["Right"] != null)
.ToList();

从右:

var styleWithSpecificColli = session.Query<Style>()
 .Select(s => s.Skus["Sku1"])
 .Where(c => c.Collis["Right"] != null)
 .ToList();