2012-04-23 9 views
1

PredicateBuilderクラスを使用して、RavenDBが解釈して使用できるWHERE句を作成できますか?私はsession.Query()とLuceneQueryを試みたが、彼らそれぞれが失敗しました:RavenDBとPredicateBuilder

public static List<T> GetObjectList<T>(Expression<Func<T, bool>> whereClause) 
{ 
    using (IDocumentSession session = GetRavenSession()) 
    { 
     return session.Query<T>().Where(whereClause).Take(int.MaxValue).ToList(); 
    } 
} 

これは実行時エラーです:

ここ

はsession.Query()の試みです一つ期待していた、1行目の "列2 が発生しました"「OR":::

Lucene.Net.QueryParsers.ParseException:(ここでは期待のアイテムのリスト) を解析 '(OR)OR' することはできません。

そして、私はLuceneQuery()しようとした場合:

エラー2「Raven.Client.IDocumentQueryBase> .Where(システム:

public static List<T> GetObjectList<T>(Expression<Func<T, bool>> whereClause) 
{ 
    Func<T, bool> compiledWhereClause = whereClause.Compile(); 

    using (IDocumentSession session = GetRavenSession()) 
    { 
     return session.Advanced.LuceneQuery<T>().Where(compiledWhereClause).Take(int.MaxValue).ToList(); 
    } 
} 

を、私はこのコンパイル時エラーが発生します。 'IDocumentQuery上でWhere(x => x.Name == "Ayende")などのメモリ内フィルタを発行することはできません。

編集:これはwhereClauseは、最初の例のように見えるものである:

{F =>((偽OrElse呼び出し(X =>()×(変換==値を.EquipmentId(ReadFromRaven.Logic .Readers.RavenReader 1+<>c__DisplayClassa[WriteToRaven.Data.Marker]).tempCoater.MarkerEquipmentId), f)) OrElse Invoke(x => (Convert(x).EquipmentId == value(ReadFromRaven.Logic.Readers.RavenReader 1+ <> c__DisplayClassa [WriteToRaven.Data.Marker])tempCoater.MarkerEquipmentId)、F))}

編集2:これは私がWHERE句

を構築しています方法です

これは電話です:

List<T> newList = RavenDataAccess.GetObjectList<T>(BuildWhereClause(x => x.MarkerReadTime > timeChunk.StartTime && x.MarkerReadTime <= timeChunk.EndTime)); 

そして、これはBuildWhereClause()メソッドのシグネチャとは関係法の一部です:

private static Expression<Func<T, bool>> BuildWhereClause(Expression<Func<T, bool>> readTimeExpression) 

    Expression<Func<T, bool>> innerWhereClause = PredicateBuilder.False<T>(); 

    foreach (Coater coater in coaters) 
    { 
     var tempCoater = coater; 
     innerWhereClause = innerWhereClause.Or<T>(x => x.EquipmentId == tempCoater.MarkerEquipmentId); 
    } 

    Expression<Func<T, bool>> outerWhereClause = PredicateBuilder.True<T>(); 
    outerWhereClause = outerWhereClause.And<T>(readTimeExpression); 
    outerWhereClause = outerWhereClause.And<T>(innerWhereClause); 

    _whereClause = innerWhereClause; 

    return _whereClause; 
+0

第1回試行では、 'session.Query ().Where(whereClause).Take(int.MaxValue).ToString()'が表示されます。 –

+0

また、GetListObject (..)関数に渡されている式は、デバッガ( 'whereClause')のように見えますか?空の句があるチャンスはありますか?つまり、「OR」ステートメントと角かっこだけが含まれていますか? –

+0

@MattWarren ToString()はこれを示します:(OR)OR。私はwhereClauseの値を私の質問に加えました。それはまったく役に立ちますか? –

答えて

0

あなたは、クエリに渡すしようとしている実際の表現とは何ですか?

クエリを動的に作成する場合は、Lucene Queryを使用し、linqを使用して動的に何かを構築しないでください。

+0

where節の作成方法のコードを追加しました。 Lucene Queryを使ってみましたが、コンパイル時にエラーが出ました。私は* PredicateBuilderなしでLucene *を使うべきだと言っていますか? –

1

私は同じエラーがあります。これは私が解決する方法です:

http://www.albahari.com/nutshell/predicatebuilder.aspxからpredicateBulderを使用して、次のように呼び出します: Session.Query()。Where(predicate.Compile())。ToList();私はpredicate.Compile()と呼ばれる呼び出されたことに注意してください。