LINQ to Entities无法识别方法

时间:2013-06-26 01:48:38

标签: linq entity-framework linq-to-entities

我有以下代码:

    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对象。有什么办法可以在这个查询中运行我的代码吗?

更新

以下代码:

    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 to Entities无法识别方法'布尔值   IsTopLevelArchivedFolder(Nogginator.Repository.Models.Folder)'方法,   并且此方法无法转换为商店表达式。

1 个答案:

答案 0 :(得分:0)

LINQ告诉你它不知道如何将你的函数转换为SQL。您可以使用.AsEnumberable()上的IQueryable方法告诉LINQ在内存中执行您的功能:

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