Запросы к вложенным словарям в RavenDB - PullRequest
2 голосов
/ 13 августа 2011

Этот вопрос касается запросов во вложенных словарях.

У меня есть случай, который можно упростить до следующей настройки со стилем, содержащим список SKU, содержащий список Collis.

ОПРЕДЕЛЕНИЯ КЛАССА:

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

ДАННЫЕ JSON В RAVEN DB:

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

ДЕЙСТВИТЕЛЬНЫЕ ЗАПРОСЫ:

(запросить стиль со скином определенных имен)

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", содержащуюcolli с именем "Right")

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

Когда я пытаюсь выполнить последний запрос, я получаю сообщение:

{"Url": "/ indexes / dynamic / Styles? запрос = -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 & aggregation = None "," Error ":" System.ArgumentException: поле ') CollisRight' не проиндексировано, не может запрашивать поля, которые не проиндексированы \ r \ n в Raven.Database.Indexing.Index.IndexQueryOperation.AssertQueryDoesNotContainFieldsThatAreNotIndexes () в c: \ Builds \ raven \ Raven.Database \ Indexing \ Index.cs: строка 628 \ r \ n в Raven.Database.Indexing.Index.IndeNeQuery.) в 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 collection) \ r \ n at ........

Можно ли выполнить последний запрос?Может быть, определить, что индексировать в RavenDB?

Заранее спасибо.

1 Ответ

3 голосов
/ 18 августа 2011

Я разместил приведенный выше пример как неудачный тест, но 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();
...