是否可以使用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':在第2列第1行遇到"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();
}
}我得到了这个compile-time错误:
错误2 'Raven.Client.IDocumentQueryBase>.Where(System.Func)‘过时了:’您不能在IDocumentQuery上发出内存中的过滤器--比如Where(x=>x.Name == "Ayende")。
编辑:这是whereClause在第一个示例中的样子:
{f => ((False OrElse Invoke)(x => (转换(X).EquipmentId == 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;发布于 2012-04-24 04:09:58
您试图传递给查询的实际表达式是什么?
如果要动态构建查询,请使用Lucene查询,不要尝试使用linq动态构建查询。
发布于 2012-04-30 22:49:58
我也有同样的错误。我就是这样解决的:
我使用来自Session.Query().Where(predicate.Compile()).ToList();的predicateBulder并调用如下:请注意I调用predicate.Compile()方法。
https://stackoverflow.com/questions/10287876
复制相似问题