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;
第1回試行では、 'session.Query().Where(whereClause).Take(int.MaxValue).ToString()'が表示されます。 –
また、GetListObject(..)関数に渡されている式は、デバッガ( 'whereClause')のように見えますか?空の句があるチャンスはありますか?つまり、「OR」ステートメントと角かっこだけが含まれていますか? –
@MattWarren ToString()はこれを示します:(OR)OR。私はwhereClauseの値を私の質問に加えました。それはまったく役に立ちますか? –