如何从IList <string>?</string>类型的属性中检索RavenDb中的不同值

时间:2012-04-12 15:15:19

标签: .net list distinct ravendb

我在RavenDb中存储了以下类:

public class User
{
  public string Id {get;set;}
  public string Name {get;set;}
  public IList<string> Phrases {get;set;} 
}

我想要所有用户的所有不同短语。

解决方案1(未经测试)

session.Query<User>().SelectMany(c=>c.Educations).Distinct();

您认为这种方法会出现性能问题吗?

解决方案2(已测试) 使用谷歌我发现session.Advanced.DatabaseCommands.GetTerms()很适合获取属性的不同值。但是这里我有一个List属性。 根据这个:

  • 我创建了一个基于CharTokenizer的自定义Tokenizer,根据特定的char(|)分割值;
  • 我创建了一个类似于WhiteSpaceAnalyzer的自定义分析器;
  • 我在地图中创建了一个带有“phrase = string.join(”|“,Phrases)”的索引,指定我的自定义分析器;
  • 我使用session.Advanced.DatabaseCommands.GetTerms(myindexname,phrase,null,int.maxvalue)。

在您看来,哪种方法更好?其他更好/更简单的解决方案?

感谢。

1 个答案:

答案 0 :(得分:4)

如果您编写索引,如下所示:

from user in docs.Users
from phrase in user.Phrases
select new { phrase }

然后session.Advanced.DatabaseCommands.GetTerms()将起作用,因此您可以使用解决方案2 而不会增加复杂性。

认为 解决方案2 将是最有效的,因为它直接从Lucene索引中获取条款,但您​​必须进行基准测试它可以肯定地知道。