RavenDB - 获取非根级别属性中的根属性的ID

时间:2012-01-09 21:20:25

标签: ravendb

使用RavenDB,是否可以在另一个属性中获取属性的ID?例如,如果Foo有一个Bar对象列表,并且每个Bar对象都有一个SnuhId属性,我可以使用一个Include来获取每个Snuh属性的ID吗?

我尝试了下面的查询,但是我得到了一个RavenDB异常:索引超出范围。在此查询中,ApplicationServer是根元素,它具有ApplicationsWithOverrideGroup对象的列表。每个对象都有一个ApplicationId属性。这是我希望在include中获得的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)

如果第一个选项确实有效,那么在Include()中指定的属性将包含其中的ID属性。是吗?

我不确定这两者是否真的有效,但它们似乎是。如果他们都工作,我想知道一个人是否比另一个更好......

好的,那不行。 NumberOfRequests正在增加,我猜这意味着数据库的访问次数正在增加,而不仅仅是会话中的内容。

1 个答案:

答案 0 :(得分: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);
}