2013-06-26 1 views
0

을 인식하지 나는 다음과 같은 코드가 있습니다LINQ는 방법

public IList<Folder> GetArchivedFolders(int userId) 
    { 
     return _db.Folders.Where(f => f.IsArchived).Where(s => 
      IsTopLevelArchivedFolder(s.FolderId) 
      ).ToList(); 
    } 
    private bool IsTopLevelArchivedFolder(int folderId) 
    { 
     var folder = GetFolder(folderId); 
     if (folder.ParentFolderIdWhileArchived > 0) 
     { 
      if (folder.ParentFolderId != null && !GetFolder((int) folder.ParentFolderId).IsArchived) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

이 EF 내 코드를 실행할 수 없습니다 것 때문에 비록 작동하지 않는.

public System.Linq.Expressions.Expression<Func<Folder, bool>> IsTopLevelArchivedFolder() 
    { 
     var folder = this; 
     if (folder.ParentFolderIdWhileArchived > 0) 
     { 
      if (folder.ParentFolderId != null && !GetFolder((int) folder.ParentFolderId).IsArchived) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

하지만 this는 컨테이너 클래스가 아닌 Folder 객체에 해결된다

나는이 시도. 이 쿼리에서 내 코드를 실행할 수있는 방법이 있습니까?

UPDATE :

다음 코드를이있는

public IList<Folder> GetArchivedFolders(int userId) 
    { 

     return _db.Folders. 
      Where(f => f.IsArchived). 
      Where(s => IsTopLevelArchivedFolder(s)). 
      ToList(); 
    } 
    public bool IsTopLevelArchivedFolder(Folder folder) 
    { 
     return (folder.ParentFolderIdWhileArchived > 0) && 
      (folder.ParentFolderId != null && !folder.IsArchived); 
    } 

결과 엔티티

LINQ 메소드 '부울 IsTopLevelArchivedFolder (Nogginator.Repository를 인식하지 못한다. Models.Folder) '메서드 및이 메서드는 저장소 식으로 변환 할 수 없습니다.

답변

0

LINQ는 함수를 SQL로 변환하는 방법을 알 수 없다는 것을 알려줍니다. 당신은 당신의 IQueryable.AsEnumberable() 방법을 사용하여 메모리에 함수를 실행하기 위해 LINQ를 알 수 있습니다 :

public IList<Folder> GetArchivedFolders(int userId) 
{ 
    return _db.Folders.Where(f => f.IsArchived) 
         .AsEnumerable() 
         .Where(s => IsTopLevelArchivedFolder(s.FolderId)) 
         .ToList(); 
} 
+0

감사 마티아스을! – SB2055