2013-08-23 50 views
1

我在LINQ表達式中遇到Func委託問題。這是該方法的問題的一部分(repository.Items是IQueryable<T>)LINQ表達式中的Func參數

public static ActionResult XXX<T>(IRepository<T> repository, 
     Func<T, int> keyExtractor, int id = 0) 
    { 
     if (id == 0) return ... 
     T item = repository.Items.Where(x => keyExtractor(x) == id). 
      FirstOrDefault(); 
     if (item == null) return ... 
     try { 
      repository.DeleteItem(item); 
      return ... 
     } catch (Exception e) { 
      return ... 
     } 
    } 

但是,當我運行的方法,我得到錯誤,如在LINQ實體不支持節點的類型我也試過版本predikate但我沒有運氣可言

任何想法如何解決它

我找出一個可行的方法LINQ執行延遲執行,所以我必須首先執行這樣執行:?

T item = repository.Items.AsEnumerable().Where(x => keyExtractor(x) == id)

+2

這將是很好看到整個錯誤文本以及整個方法 –

+0

噢,我想通了,LINQ表達式必須先用AsEnumerable()方法或類似的東西來執行: – MilanG

+0

然後,你應該發佈這個答案並將其標記爲這樣。其他人在尋找相同的東西時 –

回答

4

如果您想在IQueryable<T>上工作,您的參數必須是Expression<Func<T, int>>而不是Func<T, int>

Func<T, int>將與IEnumerable<T>一起使用。

Where擴展方法有IQueryable<T>IEnumerable<T>,但不相同的參數相同的名稱...

(順便說一下,你可以寫repository.Items.FirstOrDefault(x => keyExtractor(x) == id);

+0

非常感謝您的回答:-) – MilanG