2011-08-13 4 views
2

Cette question concerne l'interrogation de dictionnaires imbriqués.Interrogation de dictionnaires imbriqués dans RavenDB

J'ai un cas qui peut être simplifié dans la configuration suivante avec un style contenant une liste de SKU contenant une liste de Collis.

DÉFINITIONS CLASSE:

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 DONNÉES DANS 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" 
} 

REQUÊTES VALABLE:

(Demandez le style avec skus de noms spécifiques)

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

VALIDE IMBRIQUEES QUERY

(Demandez le style contenant un sku nommé "Sku1" qui contient un Colli nommé "droit")

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

Lorsque je tente d'exécuter la dernière requête , je reçois le message:

{ "url": « /indexes/dynamic/Styles?query=-Skus.get_It em (% 2522Sku1% 2522) .Collis.Right% 253A% 255B% 255BNULL_VALUE% 255D% 255D% 2520AND% 2520Skus.get_Item (% 2522Sku1% 2522) .Collis.Right% 253A * & début = 0 & pageSize = 128 & agrégation = Aucun « « erreur »: » System.ArgumentException: Le champ «) CollisRight » est pas indexé, ne peut pas interroger sur les champs qui ne sont pas indexés \ r \ n à Raven.Database.Indexing.Index.IndexQueryOperation.AssertQueryDoesNotContainFieldsThatAreNotIndexes() dans c: \ Builds \ raven \ Raven.Database \ Indexing \ Index.cs: ligne 628 \ r \ n à Raven.Database.Indexing.Index.IndexQueryOperation.d__1c.MoveNext() dans c: \ Builds \ Raven \ Raven.Database \ Indexing \ Index.cs: ligne 542 at System.Linq.E numerable.WhereSelectEnumerableIterator 2.MoveNext()\r\n at System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext() \ r \ n à System.Collections.Generic.List 1.InsertRange(Int32 index, IEnumerable une collection) \ r \ n à ........

est-il un moyen que je peux être en mesure d'exécuter la dernière requête? Peut-être définir ce qu'il faut indexer dans RavenDB?

Merci d'avance.

+0

Je résolu le problème. J'ai changé les types de collection Skus et Colli du dictionnaire en tableaux natifs. De cette façon, je peux utiliser cette requête: "Skus, Collies, Name: Right". Si quelqu'un sait comment résoudre le problème en utilisant des dictionnaires, j'aimerais beaucoup en entendre parler :) –

+0

Stephan, Veuillez le signaler dans la liste de diffusion comme un test qui échoue –

Répondre

3

J'ai posté l'exemple ci-dessus en tant que test défaillant, mais synhershko a corrigé mon code afin de le faire fonctionner.

Il est réellement possible de le faire.La requête ressemble à ceci:

MAL:

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

DROIT:

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