& # 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);
    }
}

& # 39;调用# 39;嵌套表达式函数时,LINQ中不支持node

您可以使用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()
    }
}