RavenDB и PredicateBuilder

Можно ли использовать класс PredicateBuilder для создания предложения WHERE, которое RavenDB может интерпретировать и использовать? Я пробовал 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: не удается разобрать '( ИЛИ) ИЛИ': обнаружено " "ИЛИ "" в строке 1, столбце 2. Ожидался один из: (список ожидаемых элементов здесь).

А если я попробую 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.RavenReader1+<>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;

person Bob Horn    schedule 23.04.2012    source источник
comment
Что показывает session.Query<T>().Where(whereClause).Take(int.MaxValue).ToString() при первой попытке?   -  person Matt Warren    schedule 24.04.2012
comment
Также как выглядит выражение, которое передается в функцию GetListObject‹T›(..) в отладчике (whereClause)? Есть ли шанс, что он имеет пустые предложения, то есть просто содержит операторы ИЛИ и скобки?   -  person Matt Warren    schedule 24.04.2012
comment
@MattWarren ToString() показывает это: ( ИЛИ) ИЛИ. Я добавил значение whereClause к моему вопросу. Это вообще помогает?   -  person Bob Horn    schedule 24.04.2012


Ответы (2)


Каково фактическое выражение, которое вы пытаетесь передать запросам?

Если вы хотите построить запрос динамически, используйте Lucene Query, не пытайтесь динамически создавать что-либо с помощью linq.

person Ayende Rahien    schedule 24.04.2012
comment
Я добавил код того, как я создаю предложение where. И я попытался использовать Lucene Query, но получил ошибку времени компиляции. Вы говорите, что я должен использовать Lucene без PredicateBuilder? - person Bob Horn; 24.04.2012

у меня такая же ошибка. Вот как я решаю:

Я использую predicateBulder из http://www.albahari.com/nutshell/predicatebuilder.aspx и вызывается следующим образом: Session.Query().Where(predicate.Compile()).ToList(); Обратите внимание, что я вызвал метод predicate.Compile().

person pravangsu    schedule 30.04.2012