2013-06-26 152 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。你可以告诉LINQ内存使用.AsEnumberable()方法上的IQueryable执行你的函数:

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

感谢马蒂亚斯! – SB2055

相关问题