2011-08-13 67 views
2

此問題關於查詢嵌套字典。查詢RavenDB中的嵌套字典

我有一種情況,可以簡化爲以下設置,其樣式包含包含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; } 
} 

JSON DATA IN 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」 SKU包含一個名爲科利「右」的風格)

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

當我嘗試執行最後一個查詢,我得到的消息:

{ 「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 * & start = 0 & pageSize = 128 & aggregation = None「, 」錯誤「:」System.ArgumentException:該字段')CollisRight'不是 已編制索引,無法查詢未索引的字段\ r \ n在 Raven.Database.Indexing.Index.IndexQueryOperation.AssertQueryDoesNotContainFieldsThatAreNotIndexes () in c:\ Builds \ raven \ Raven.Database \ Indexing \ Index.cs:line 628 \ r \ n at Raven.Database.Indexing.Index.IndexQueryOperation.d__1c.MoveNext() in c:\ Builds \ raven \ Raven.Database \ Indexing \ Index.cs:line 542 \ r \ n 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 1集)\ r \ n在 ........

是否有辦法我可以執行最後一個查詢?也許定義在RavenDB中索引什麼?

提前謝謝。

+0

我解決了這個問題。我將Skus和Colli集合類型從字典更改爲本地陣列。 這樣我可以使用這個查詢:「Skus,Collies,Name:Right」。 如果有人知道如何使用字典來解決問題,我非常希望聽到它:) –

+0

Stephan, 請在郵件列表中發佈此作爲失敗的測試 –

回答

3

我發佈了上面的例子作爲失敗的測試,但是synhershko糾正了我的代碼,以使其工作。

實際上可以這樣做。查詢只是看起來像這個:

WRONG:

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

RIGHT:

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