2012-06-26 34 views
7

Có cách nào được đề xuất để tìm kiếm từng cụm từ trong số nhiều cụm từ bằng cách sử dụng StartsWith khi các cụm từ không được biết tại thời gian biên dịch không?Tìm kiếm RavenDB cho từng cụm từ bằng cách sử dụng StartsWith

tôi hình dung một cái gì đó như thế này:

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

Các truy vấn sẽ là tương đương với:

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])); 

là câu trả lời để xây dựng một truy vấn LINQ trong thời gian chạy (PredicateBuilder hoặc tương tự)?

Trả lời

4

Sử dụng LuceneQuery (có thể muốn sử dụng một phân lớp tùy thuộc vào những gì khác bạn đang làm):

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 

Nếu bạn muốn mạnh mẽ gõ tên biến kiểm tra câu trả lời này: https://stackoverflow.com/a/301957/941536

0

Bạn đang cố gắng làm gì? Có lẽ bạn nên sử dụng trường phân tích và sau đó phát hành .Search thay vì .Where.

+0

Tôi không nghĩ '.Search' sẽ làm những gì tôi muốn, tôi muốn trả về _John Doe_ khi chuỗi tìm kiếm là _Jo_, _Do_, _Jo Doe_, _Jo Do_. Tôi không nghĩ '.Search' sẽ trả về _John Doe_ trừ khi tôi khớp với một trong các thuật ngữ được phân tích? – kendaleiv

+0

Chỉ cần làm rõ, ý tôi là khi chuỗi tìm kiếm là ** bất kỳ ** nào. – kendaleiv

Các vấn đề liên quan