2012-06-26 54 views
7

當編譯時未知術語時,是否有推薦的方法來使用StartsWith搜索多個術語中的每一個?RavenDB使用Starts搜索多個術語中的每一個

我設想是這樣的:

var searchTerms = "John Doe".Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
var query = session.Query<Person, PersonIndex>() 
        .Where(x => x.FirstName.StartsWithAnyOf(searchTerms) || 
           x.LastName.StartsWithAnyOf(searchTerms)); 

的查詢是等價的:

var query = session.Query<Person, PersonIndex>() 
        .Where(x => x.FirstName.Starts(searchTerms[0]) || 
           x.LastName.StartsWith(searchTerms[0]) || 
           x.FirstName.Starts(searchTerms[1]) || 
           x.LastName.StartsWith(searchTerms[1])); 

在運行時創建LINQ查詢(PredicateBuilder或類似)的答案嗎?

回答

4

使用LuceneQuery(可能需要使用一個小節取決於別人你在做什麼):

var searchTerms = "John Doe".Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 

var query = session.Advanced.LuceneQuery<Person, PersonIndex>(); 
query = query.OpenSubclause(); // optional 

foreach (var term in terms) 
{ 
    query = query.WhereStartsWith("FirstName"), term).OrElse(); 
    query = query.WhereStartsWith("LastName"), term).OrElse(); 
} 

query = query.WhereEquals("Id", null); 
query = query.CloseSubclause(); // if OpenSubclause() was used 

如果你想強類型的變量名稱看看這個答案:https://stackoverflow.com/a/301957/941536

0

你試圖做什麼? 您可能最好使用分析字段,然後發出.Search而不是.Where

+0

我不認爲'.Search'會做我想做的事情,當搜索字符串是_Jo_,_Do_,_Jo Doe_,_Jo Do_時,我想返回_John Doe_。我不認爲'.Search'會返回_John Doe_,除非我匹配其中一個分析的術語? – kendaleiv

+0

只是爲了澄清,我的意思是當搜索字符串是**任何**。 – kendaleiv

相關問題