2012-01-09 54 views
0

使用RavenDB,是否可以獲取屬性的ID在另一個屬性中?例如,如果Foo有一個Bar對象列表,並且每個Bar對象都有一個SnuhId屬性,我可以使用一個Include來獲取每個Snuh屬性的ID嗎?RavenDB - 在非根級別屬性中獲取根屬性的ID

我試過下面的查詢,但是我得到一個RavenDB異常:索引超出範圍。在這個查詢中,ApplicationServer是一個根元素,並且它有一個ApplicationsWithOverrideGroup對象的列表。每個對象都有一個ApplicationId屬性。這是我想要包含的ApplicationId。

IEnumerable<ApplicationServer> appServers = QueryAndCacheEtags(session => 
    session.Advanced.LuceneQuery<ApplicationServer>() 
    .Include(x => x.CustomVariableGroupIds) 
    // This is the line I'm trying to make work: 
    .Include(x => (from item in x.ApplicationsWithOverrideGroup select item.ApplicationId).ToList()) 
).Cast<ApplicationServer>(); 

這些方法的任似乎是工作。需要徹底測試。

.Include(x => x.ApplicationsWithOverrideGroup) 

.Include(x => x.ApplicationsWithOverrideGroup[0].ApplicationId) 

如果該第一選項的確工作,那麼一個屬性,在一個指定的包含(),將包括在其內的ID屬性。是對的嗎?

我不確定這兩個人是否真的有效,但他們似乎是。如果他們都工作,我不知道其中一個比另一個好...

好的,那不工作。 NumberOfRequests正在增加,我猜測這意味着訪問數據庫的次數正在增加,而不僅僅是會話中的內容。

回答

0

好的,這些建議都沒有在上面的問題。我認爲必須做的是在根對象中包含嵌套屬性的ID。

這就是我所做的,我能夠將會話對象上的NumberOfRequests降到1。奇怪的是,我不得不改變這一點:

// Not using this, at least for now, because it increased the NumberOfRequests on the session... 
appServer.CustomVariableGroups = new ObservableCollection<CustomVariableGroup>(
QueryAndCacheEtags(session => session.Load<CustomVariableGroup>(appServer.CustomVariableGroupIds)).Cast<CustomVariableGroup>()); 

要這樣:

// ... however, this kept the NumberOfRequests to just one. Not sure why the difference. 
appServer.CustomVariableGroups = new ObservableCollection<CustomVariableGroup>(); 
foreach (string groupId in appServer.CustomVariableGroupIds) 
{     
    appServer.CustomVariableGroups.Add(QuerySingleResultAndCacheEtag(session => session.Load<CustomVariableGroup>(groupId)) as CustomVariableGroup); 
} 
+0

不知道我理解你想要做什麼,但如果你說出來的作品 - 那麼所以它是。 :)一方面說明,沒有理由在每個查詢上調用.Cast ()。 – 2012-01-10 03:41:15

+0

我並不總是明白我在做什麼。 :)我其實不得不打電話給Cast (),因爲我在QueryAndCacheEtags()上調用它,而不是在會話上調用它。 QueryAndCacheEtags()返回EntityBase,而不是ApplicationServer子類。 – 2012-01-10 15:58:20