& # 39;调用# 39;嵌套表达式函数时,LINQ中不支持node
本文关键字:LINQ node 不支持 表达式 调用 嵌套 函数 | 更新日期: 2023-09-27 18:14:14
我正在尝试嵌套Expression Functions
,我尝试了多种事情(Invoke
, Compile
等)并阅读了有关此异常的主题,但在嵌套表达式函数时没有看到任何附加情况。我不太了解它,它对我来说很新鲜,我想我一定是错过了一些非常简单的东西。我的目标只是能够嵌套表达式,以便GetAbilities
可以在多个其他表达式中使用,而不必复制其代码。
我怎么能做到这样呢?
public static Expression<Func<User, bool>> Test
{
get
{
Expression<Func<User, bool>> res = (u => GetAbilities.Compile()(u).Any());
return res;
}
}
public static Expression<Func<User, IEnumerable<Ability>>> GetAbilities
{
get
{
Expression<Func<User, IEnumerable<Ability>>> res = u => u.AllAbilities.Where(a => a.Type == Ability.TypeE.Initial);
return res;
}
}
在上面的例子中,当检索Test
的结果时,我得到了以下异常:
在LINQ to Entities中不支持LINQ表达式节点类型'Invoke'。
更新
见下面工作接受的解决方案:)
既然现在可以工作了,有人知道应该如何处理那些未映射的属性吗?具体地说,GetAbilities
方法是指User
类中的另一个方法,但我不能直接在查询中使用它,因为这是一个未映射的方法。所以问题是我是否应该在User
类中留下Abilities
属性供内部使用,而在查询目的中留下静态GetAbilities
属性(但这在某种程度上是复制代码),或者可以在User
类中编译和调用静态GetAbilities
?
让它保持原样,它看起来不太干净和可维护(这里看起来很简单,但实际功能更复杂):
// Used for queries
public static Expression<Func<User, IEnumerable<Ability>>> GetAbilities
{
get
{
Expression<Func<User, IEnumerable<Ability>>> res = u => u.AllAbilities.Where(a => a.Type == Ability.TypeE.Initial);
return res;
}
}
// Used for internal purpose
public IEnumerable<Ability> Abilities
{
get
{
return AllAbilities.Where(a => a.Type == Ability.TypeE.Initial);
}
}
您可以使用LinqKit做这样的事情:
public static Expression<Func<User, bool>> Test
{
get
{
//Use one expression inside another via Invoke
Expression<Func<User, bool>> res = (u => GetAbilities.Invoke(u).Any());
return res.Expand(); //Expand to create a full expression
//The result would be the same as if you have used
//u => u.AllAbilities.Where(a => a.Type == Ability.TypeE.Initial).Any()
}
}