【问题标题】:Querying nested dictionaries in RavenDB在 RavenDB 中查询嵌套字典
【发布时间】:2011-08-13 11:55:42
【问题描述】:

这个问题是关于查询嵌套字典的。

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

类定义:

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

有效查询:

(询问具有特定名称的sku的样式)

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();

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

{ "网址": "/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*&start=0&pageSize=128&aggregation=None", “错误”:“System.ArgumentException:字段 ')CollisRight' 不是 已编入索引,无法查询未编入索引的字段\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.WhereSelectEnumerableIterator2.MoveNext()\r\n at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()\r\n 在 System.Collections.Generic.List1.InsertRange(Int32 index, IEnumerable1 集合)\r\n 在 ........

有没有办法可以执行最后一个查询?也许定义在 RavenDB 中索引什么?

提前谢谢你。

【问题讨论】:

  • 我解决了这个问题。我将 Skus 和 Colli 集合类型从字典更改为原生数组。这样我就可以使用这个查询:“Skus,Collies,Name:Right”。如果有人知道如何使用字典解决问题,我很想听听 :)
  • Stephan,请将此作为失败的测试发布在邮件列表中

标签: indexing nested ravendb dictionary


【解决方案1】:

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

实际上可以做到这一点。查询看起来像这样:

错误:

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多