【发布时间】:2011-05-04 22:08:18
【问题描述】:
我正在尝试删除一些用于安全权限的 lambda 表达式。是否可以采用 lamda 表达式并将其应用于单个实体以实现 true?
假设我有一个 Person 和一个 DocumentFolder
Expression<Func<Person, bool>> CanSeePerson()
{
return c => !c.IsPrivate;
}
还有一个用于文件夹
Expression<Func<DocumentFolder, bool>> CanSeeFolder()
{
return c => !c.IsPrivate && c.Owner.CanSeePerson(); // <- ???
}
我怎么能在单一类型上使用 CanSeePerson() 函数来返回 true 并维护一个可以在这样的 linq 查询中使用的表达式
Entities.DocumentFolder.Where(CanSeeFolder());
我知道如何在 iqueryable 上使用 where,但我看不到如何将表达式树应用于单个值。
这会引发错误:无法创建“Person”类型的常量值。此上下文仅支持原始类型(“例如 Int32、String 和 Guid”)。
Expression<Func<DocumentFolder, bool>> CanSeeFolder()
{
return c => !c.IsPrivate &&_entities.Persons.Where(x => x.Id == c.Owner.Id).Any(CanSeePerson());
}
差异似乎是基于将 IQueryable Directly 放在语句中。这也不起作用
Expression<Func<DocumentFolder, bool>> CanSeeFolder()
{
return c => !c.IsPrivate &&_entities.Persons.Where(CanSeePerson()).Contains(c.User);
}
但这确实有效
Expression<Func<DocumentFolder, bool>> CanSeeFolder()
{
var canSeePersons = _entities.Persons.Where(CanSeePerson());
return c => !c.IsPrivate && canSeePersons.Contains(c.User);
}
附言我知道我很烂@使用这个stackoverflow格式化的东西哈哈
之所以可行,是因为 CanSeePerson() 函数无法在表达式中转换和使用。当您将 canSeePersons 变量放入函数中时,您将放入可在表达式中使用的 iQueryable 类型。使用“var”有点复杂。
【问题讨论】:
-
我可能遗漏了一些简单的东西