1

是否可以使用 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)' 已过时:'您不能在 IDocumentQuery 上发出内存过滤器 - 例如 Where(x=>x.Name == "Ayende")。

编辑:这是第一个示例中 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.RavenReader1+<>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;
4

2 回答 2

1

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

我使用来自http://www.albahari.com/nutshell/predicatebuilder.aspx的 predicateBulder并调用如下: Session.Query().Where(predicate.Compile()).ToList(); 请注意我称为 predicate.Compile() 方法。

于 2012-04-30T22:49:58.013 回答
0

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

如果要动态构建查询,请使用 Lucene Query,不要尝试使用 linq 动态构建某些内容。

于 2012-04-24T04:09:58.943 回答