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