2012-01-09 2 views
0

RavenDB를 사용하면 다른 속성에있는 속성의 ID를 가져올 수 있습니까? 예를 들어 Foo에 Bar 객체 목록이 있고 각 Bar 객체에 SnuhId 속성이있는 경우 각 Snuh 속성의 ID를 가져 오는 Include를 사용할 수 있습니까?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가 증가하고 있습니다. 추측 하건데 세션에있는 것 대신 DB 로의 이동 수가 증가하고 있음을 의미합니다.

답변

0

좋아, 그 제안은 위의 질문에서 작동하지 않습니다. 내가해야 할 일은 루트 객체에 중첩 된 속성의 ID를 포함시키는 것입니다.

그리고 그게 내가 한 일이며 세션 객체의 NumberOfRequests를 하나까지 얻을 수있었습니다. 이상하게도, 나는이를 변경했다 : 이것에

// 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

난 당신이 뭘 하려는지 이해하지만, 당신이 그것을 작동 말한다면 확실하지 - 다음이 될 수 있도록. :) 한 쪽 메모는 전화 할 이유가 없습니다. 모든 쿼리에 대해 ()을 호출하십시오. –

+0

나는 내가하고있는 것을 항상 이해하지 못한다. :) 실제로 나는 캐스트 ()을 호출해야하므로, 세션이 아니라 QueryAndCacheEtags()에서 호출하기 때문에. QueryAndCacheEtags()는 ApplicationServer 서브 클래스가 아닌 EntityBase를 리턴합니다. –