首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RavenDB和PredicateBuilder

RavenDB和PredicateBuilder
EN

Stack Overflow用户
提问于 2012-04-23 20:36:04
回答 2查看 904关注 0票数 1

是否可以使用PredicateBuilder类构建RavenDB可以解释和使用的WHERE子句?我尝试过session.Query()和LuceneQuery,但它们都失败了:

这里是session.Query()尝试:

代码语言:javascript
复制
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():

代码语言:javascript
复制
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子句

这就是号召:

代码语言:javascript
复制
List<T> newList = RavenDataAccess.GetObjectList<T>(BuildWhereClause(x => x.MarkerReadTime > timeChunk.StartTime && x.MarkerReadTime <= timeChunk.EndTime));

这是BuildWhereClause()方法签名和方法中重要的部分:

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-24 04:09:58

您试图传递给查询的实际表达式是什么?

如果要动态构建查询,请使用Lucene查询,不要尝试使用linq动态构建查询。

票数 0
EN

Stack Overflow用户

发布于 2012-04-30 22:49:58

我也有同样的错误。我就是这样解决的:

我使用来自Session.Query().Where(predicate.Compile()).ToList();的predicateBulder并调用如下:请注意I调用predicate.Compile()方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10287876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档