Csharp/C#教程:如何撰写现有的Linq表达式分享


如何撰写现有的Linq表达式

我想编写两个Linq表达式的结果。 它们以forms存在

Expression<Func> 

所以我想要编写的两个本质上是一个参数(类型为T)的委托,它们都返回一个布尔值。 我想要的结果是对布尔值的逻辑评价。 我可能会将它作为扩展方法实现,所以我的语法将是这样的:

 Expression<Func> expression1 = t => t.Name == "steve"; Expression<Func> expression2 = t => t.Age == 28; Expression<Func> composedExpression = expression1.And(expression2); 

后来在我的代码中我想评估组合表达式

 var user = new User(); bool evaluated = composedExpression.Compile().Invoke(user); 

我用了几个不同的想法,但我担心它比我希望的更复杂。 这是怎么做到的?

这是一个例子:

 var user1 = new User {Name = "steve", Age = 28}; var user2 = new User {Name = "foobar", Age = 28}; Expression> expression1 = t => t.Name == "steve"; Expression> expression2 = t => t.Age == 28; var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast()); var result = Expression.Lambda>(Expression.And(expression1.Body, invokedExpression), expression1.Parameters); Console.WriteLine(result.Compile().Invoke(user1)); // true Console.WriteLine(result.Compile().Invoke(user2)); // false 

您可以通过扩展方法重用此代码:

 class User { public string Name { get; set; } public int Age { get; set; } } public static class PredicateExtensions { public static Expression> And(this Expression> expression1,Expression> expression2) { InvocationExpression invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast()); return Expression.Lambda>(Expression.And(expression1.Body, invokedExpression), expression1.Parameters); } } class Program { static void Main(string[] args) { var user1 = new User {Name = "steve", Age = 28}; var user2 = new User {Name = "foobar", Age = 28}; Expression> expression1 = t => t.Name == "steve"; Expression> expression2 = t => t.Age == 28; var result = expression1.And(expression2); Console.WriteLine(result.Compile().Invoke(user1)); Console.WriteLine(result.Compile().Invoke(user2)); } } 

您也可以使用LinqKit,它可以为您完成所有这些工作。请查看此链接https://www.albahari.com/nutshell/linqkit.aspx

为什么不使用Expression.And并处理生成的BinaryExpression

 Expression> expr1 = t => t.Name == "steve"; Expression> expr2 = t => t.Age == 28; Expression composed = Expression.And(expr1.Body, expr2.Body); 

你当然可以把它捆绑成一个lambda来获得你想要的签名,但这很昂贵,应该只进行一次 ,而不是多次:

 Expression> result = Expression.Lambda>( expr, Expression.Parameter(typeof(T), "t") ); 

/编辑:您当然可以按如下方式组合lambdas,但这涉及冗余编译和函数调用:

 Expression> z = t => expr1.Compile()(t) && expr2.Compile()(t); 

该死,维持停工。 不得不再次输入整个post。 : – /

/编辑:aku是对的。 您必须单独调用expr2 ,否则编译器将找不到参数引用。

上述就是C#学习教程:如何撰写现有的Linq表达式分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/942152.html

(0)
上一篇 2021年11月13日
下一篇 2021年11月13日

精彩推荐