2012-04-23 28 views
1

是否可以使用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; 
+0

在第一次嘗試中,session.Query ().Where(whereClause).Take(int.MaxValue).ToString()'show? – 2012-04-23 21:14:22

+0

還有什麼傳遞到GetListObject (..)funciton的表達式看起來像在調試器('whereClause')中?是否有機會使用空子句,即只包含「OR」語句和括號? – 2012-04-23 22:36:08

+0

@MattWarren ToString()顯示:(OR)OR。我將whereClause的值添加到了我的問題中。這些幫助有用? – 2012-04-24 00:34:20

回答

0

什麼是你試圖傳遞給查詢的實際體現在哪裏?

如果要動態構建查詢,請使用Lucene Query,不要嘗試使用linq動態構建某些內容。

+0

我添加了如何構建where子句的代碼。我試着使用Lucene Query,但是我得到了一個編譯時錯誤。你是說我應該使用Lucene *而沒有* PredicateBuilder? – 2012-04-24 11:57:13