PredicateBuilder クラスを使用して、RavenDB が解釈して使用できる WHERE 句を構築することは可能ですか? session.Query() と LuceneQuery を試しましたが、それぞれ失敗しました:
session.Query() の試みは次のとおりです。
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();
}
}
これは実行時エラーです。
Lucene.Net.QueryParsers.ParseException: '( OR) OR' を解析できません: 行 1、列 2 で " "OR "" が見つかりました。
LuceneQuery() を試してみると、次のようになります。
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();
}
}
次のコンパイル時エラーが発生します。
エラー 2 'Raven.Client.IDocumentQueryBase>.Where(System.Func)' は廃止されました: ' Where(x=>x.Name == "Ayende") などのインメモリ フィルタを IDocumentQuery で発行することはできません。
編集:これは、最初の例で whereClause がどのように見えるかです:
{f => ((False OrElse Invoke(x => (Convert(x).EquipmentId == value(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;