2012-01-09 5 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を1つに減らすことができました。 - それは可能よう

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

ない私はあなたが何をしようとして理解し、しかし、あなたが言うならばそれが動作を確認してください。これに

// 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>()); 

:不思議なことに、私はこれを変更しなければなりませんでした。 :) 1つの副言は、すべてのクエリで.Cast ()を呼び出す理由はありません。 –

+0

私は自分がやっていることをいつも理解していません。 :)実際には、セッションではなくQueryAndCacheEtags()で呼び出すので、キャスト()を呼び出す必要があります。 QueryAndCacheEtags()は、ApplicationServerサブクラスではなく、EntityBaseを返します。 –

関連する問題