C# ';调用&x27;嵌套表达式函数时,LINQ中不支持节点

C# ';调用&x27;嵌套表达式函数时,LINQ中不支持节点,c#,entity-framework,linq,lambda,C#,Entity Framework,Linq,Lambda,我正在尝试嵌套表达式函数,我尝试了多种方法(调用,编译等)并阅读了有关此异常的主题,但在嵌套表达式函数时未看到任何案例追加。我对它了解不多,它对我来说很新,我想我一定错过了一些非常简单的东西。 我的目标只是能够嵌套表达式,以便GetAbilities可以在多个其他表达式中使用,而无需复制其代码 我怎么能做到这一点呢 public static Expression<Func<User, bool>> Test { get {

我正在尝试嵌套
表达式函数
,我尝试了多种方法(
调用
编译
等)并阅读了有关此异常的主题,但在嵌套表达式函数时未看到任何案例追加。我对它了解不多,它对我来说很新,我想我一定错过了一些非常简单的东西。
我的目标只是能够嵌套表达式,以便
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;
        }
    }
您可以使用来执行以下操作:

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()

    }
}
公共静态表达式测试
{
得到
{
//通过调用在另一个表达式中使用一个表达式
表达式res=(u=>GetAbilities.Invoke(u.Any());
return res.Expand();//展开以创建完整表达式
//结果将与您使用的相同
//u=>u.AllAbilities.Where(a=>a.Type==Ability.TypeE.Initial).Any()
}
}

您可以使用。这里有一个例子:非常感谢,似乎很好:)你可以把它作为答案发布,我会接受的。不过,使用
AsExpandable
不会有任何性能问题吗?它不会枚举整个集合,对吗?嗨,Flash。别担心,它只是重写了表达式树。如果
Expand
展开所有表达式调用,那么使用
AsExpandable()
不是很有必要的。您可以通过添加
public static Func GetAbilitiesFunc{get;}=GetAbilities.Compile()重用逻辑然后
公共IEnumerable能力=>GetAbilitiesFunc(此)非常感谢伊万,我会按照你说的去做,你的建议总是相关的,并且已经帮了我很多:)
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()

    }
}