2013-08-23 3 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

것은 전체 오류 텍스트를 볼 것이 좋을 것이다

Where 확장 방법은

은 (그런데 당신은 repository.Items.FirstOrDefault(x => keyExtractor(x) == id)을 쓸 수 ... IQueryable<T>IEnumerable<T>,하지만 같은 인수에 대해 동일한 이름을 가진 전체 메서드뿐만 아니라 –

+0

아, 알아 냈어 .LINQ 표현식은 AsEnumerable() 메서드 또는 다른 유사 함수에 의해 먼저 실행되어야합니다. – MilanG

+0

그러면이 질문을 대답으로 게시하고이를 표시해야합니다. 다른 사람들이 같은 것을 검색 할 때 –

답변

4

IQueryable<T>에서 작업하려면 인수가 Expression<Func<T, int>>이어야하며 Func<T, int>이 아니어야합니다.

Func<T, int>IEnumerable<T>으로 작동합니다.

+0

답변 해 주셔서 감사합니다 .-) – MilanG

관련 문제