我有以下代码:
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)'方法, 并且此方法无法转换为商店表达式。
答案 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();
}