Можно ли использовать класс 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.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;
session.Query<T>().Where(whereClause).Take(int.MaxValue).ToString()
при первой попытке? - person Matt Warren   schedule 24.04.2012whereClause
)? Есть ли шанс, что он имеет пустые предложения, то есть просто содержит операторы ИЛИ и скобки? - person Matt Warren   schedule 24.04.2012