2010-12-13 45 views
2

行,所以我寫了以下功能:無法從通用投得到LINQ where子句

private IQueryable<LogEntry> SelectAll<T>(IEnumerable<LogEntry> logEntries, List<Expression<Func<LogEntry, bool>>> whereClause) 
{ 
    var selectAllQuery = from l in logEntries select l; 
    if (whereClause != null) 
    { 
     foreach (Expression<Func<LogEntry, bool>> whereStatement in whereClause) 
     { 
      selectAllQuery = selectAllQuery.Where(whereClause); 
     } 
    } 
} 

但它不會編譯。當它試圖在「selectAllQuery」返回的東西如下:這將引發一個錯誤:

System.Collections.Generic.IEnumerable」不包含定義‘在哪裏’和最佳推廣方法重載 System.Linq的.Enumerable.Where(System.Collections.Generic.IEnumerable,System.Func)」有一些無效參數

我已經試過這種鑄造每哪種方式我能想到的都無濟於事。在上面的代碼中,運行初始選擇語句返回selectAllQuery類型System.Linq.Enumerable.WhereSelectEnumerableIterator<LogEntry,LogEntry>

很明顯,我錯過了LINQ的一些基本知識。但是什麼?

乾杯。

回答

5

問題是selectAllQueryIEnumerable<LogEntry>,您需要它是IQueryable<LogEntry>才能使用表達式樹。嘗試只是改變了方法的第一行:

var selectAllQuery = logEntries.AsQueryable(); 

另外,編譯謂詞,你去讓他們進入委託形式:

foreach (Expression<Func<LogEntry, bool>> whereStatement in whereClause) 
{ 
    selectAllQuery = selectAllQuery.Where(whereStatement.Compile()); 
} 

編輯:好的,問題不只是因爲Queryable,但是因爲你的命名。讓我們來看看這個foreach聲明:

foreach (Expression<Func<LogEntry, bool>> whereStatement in whereClause) 
{ 
    selectAllQuery = selectAllQuery.Where(whereClause); 
} 

你不是在循環體使用whereStatement任何地方。您正試圖在每次迭代中調用Where以及整個子句列表。這是更好的命名會有所幫助。試試這個,例如:

private IQueryable<LogEntry> SelectAll<T>(IEnumerable<LogEntry> logEntries, 
    List<Expression<Func<LogEntry, bool>>> filters) 
{ 
    var selectAllQuery = logEntries.AsQueryable(); 
    if (filters != null) 
    { 
     foreach (var filter in filters) 
     { 
      selectAllQuery = selectAllQuery.Where(filter); 
     } 
    } 
    return selectAllQuery; 
} 

由於參數現在是多元狀態,它看起來明顯錯誤作爲參數傳遞給Where方法 - 而whereStatementwhereClause之間的差異並不在所有明顯因爲前者是單數,後者是複數。

+0

是的,你說得對。 – jason 2010-12-13 14:13:01

+0

好像都沒有工作。根據Intellisense在whereClause上沒有「Compile」方法,並將var更改爲AsQueryable()我仍然收到類似的錯誤 - Error 'System.Linq.IQueryable '不包含'Where'的定義,和最好的擴展方法重載'System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable ,System.Func )'有一些無效的參數。我在發佈之前確實嘗試了AsQueryable,因爲它似乎是一個明顯的解決方案。 – 2010-12-13 14:16:27

+0

@Matt:對不起,應該是'whereStatement。編譯「 - 如果你在原始代碼的循環體中使用了whereStatement,但是使用AsQueryable,那也可以。將使用建議的名稱更改進行編輯... – 2010-12-13 14:18:25

1

有些時候,這些類型的錯誤會通過簡單的解決方案,比如將System.Linq添加到項目中,然後在類文件中引用它。非常難過,VS IDE不能幫助我們解決重構菜單的一部分...