2012-06-25 13 views
8

利用可能な値でフィルタリングするRavenDBクエリを書きたいが、その値が利用できない場合は、すべてのオブジェクトを返すようにしたい。RavenDB - オプションwhere句

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

をしかし、以下は動作しません:たとえば、オブジェクトへのLINQで、私はこのような何かを行うことができますインデックス付きの値ではない

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

userEntryので、これは例外をスローします。

どうすればこの問題を解決できますか?

+0

最悪のシナリオは、if文だけ 'userEntry == string.Empty'、クエリを確認するために行いますそれに応じて!ボーナス、理解しやすい! – banging

+0

私はあなたが何を意味するかを見ていると思いますが、わかりやすくするために質問を単純化しました。私の実際のシナリオはより複雑で、フィルタリングのためにすべてオプションのフィールドが10個あり、ユーザーが入力したものがあればそれらをクエリに含めたいと思っています。しかし、ユーザーがそれらを空白のままにしておくと、それらは除外されるべきです。したがって、可能なすべてのフィルタの組み合わせに対して異なるクエリを使用してif文を記述することは実用的ではありません。 –

答えて

9

複数のオプションの述語についてコメントをもとに、あなたはこのような何か行うことができるはず:

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

パーフェクト、それは私が探していたものです。ありがとうございました! –