是否可以使用PredicateBuilder類來構建RavenDB可以解釋和使用的WHERE子句?我試過session.Query()和LuceneQuery,但他們每個失敗:RavenDB和PredicateBuilder
這裏是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列。 期待之一:(這裏預計項目清單) 。
如果我嘗試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>。哪裏(系統。 Func)'已過時:' 您不能在IDocumentQuery中發出內存過濾器,例如Where(x => x.Name ==「Ayende」)。
編輯:這是什麼whereClause看起來像在第一示例:
{F =>((假OrElse運算調用(X =>(轉換(x)的.EquipmentId ==值(ReadFromRaven.Logic .Readers.RavenReader 1+<>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().Where(whereClause).Take(int.MaxValue).ToString()'show? –
2012-04-23 21:14:22
還有什麼傳遞到GetListObject(..)funciton的表達式看起來像在調試器('whereClause')中?是否有機會使用空子句,即只包含「OR」語句和括號? –
2012-04-23 22:36:08
@MattWarren ToString()顯示:(OR)OR。我將whereClause的值添加到了我的問題中。這些幫助有用? – 2012-04-24 00:34:20