2012-06-25 33 views
8

Tôi muốn viết truy vấn RavenDB lọc theo giá trị nếu nó có sẵn, nhưng nếu giá trị đó không có sẵn, tôi muốn nó trả về tất cả các đối tượng. Ví dụ, trong LINQ to đối tượng, tôi có thể làm một cái gì đó như thế này:RavenDB - Tùy chọn where khoản

var matches = people.Where(x => x.LastName == userEntry || userEntry == string.Empty).ToList(); 

Nhưng sau đây sẽ không hoạt động:

var matches = RavenSession.Query<Person>().Where(x => x.LastName == userEntry || userEntry == string.Empty).ToList(); 

userEntry không phải là một giá trị được lập chỉ mục, điều này ném một ngoại lệ.

Tôi làm cách nào để thực hiện việc này?

+0

tệ nhất kịch bản trường hợp, chỉ cần làm một câu lệnh if để kiểm tra 'userEntry == string.Empty' và truy vấn phù hợp! Tiền thưởng, nó dễ hiểu hơn !! – banging

+0

Tôi nghĩ tôi hiểu ý bạn là gì, nhưng tôi đã đơn giản hóa câu hỏi cho sự rõ ràng. Kịch bản thực tế của tôi phức tạp hơn, nơi tôi có ~ 10 trường có tất cả tùy chọn để lọc và bất kỳ trường hợp nào người dùng điền vào, tôi muốn đưa các trường đó vào truy vấn. Nhưng nếu người dùng để trống, chúng sẽ bị bỏ đi. Vì vậy, sẽ không thực tế nếu viết các câu lệnh với các truy vấn khác nhau cho mọi kết hợp bộ lọc có thể có. –

Trả lời

9

Dựa trên nhận xét của bạn về nhiều vị tùy chọn, bạn sẽ có thể làm điều gì đó như thế này:

var where = new List<Expression<Func<Person, bool>>>(); 

if (!string.IsNullOrWhitespace(lastName)) 
    where.Add(p => p.LastName == lastName); 

if (!string.IsNullOrWhitespace(firstName)) 
    where.Add(p => p.FirstName == firstName); 

// etc... 

var query = session.Query<Person>(); 

foreach (var clause in where) 
    query = query.Where(clause); 

var results = query.ToList(); 
+1

Tuyệt vời, đó chỉ là những gì tôi đang tìm kiếm. Cảm ơn bạn! –

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