Tag: expression trees

如何在C#/ .NET中使用LINQ表达式树调用lambda

我想使用表达式树动态创建一个方法来调用lambda。 第一次调用ComposeLambda函数时,以下代码运行正常,但第二次调用失败,并显示以下错误消息。 为调用方法’Int32 lambda_method(System.Runtime.CompilerServices.Closure,Int32)提供的参数数量不正确 { Func innerLambda = i => i + 1; var composedLambda = ComposeLambda(innerLambda); Console.WriteLine(composedLambda.DynamicInvoke(0)); var composedLambda2 = ComposeLambda(composedLambda); Console.WriteLine(composedLambda2.DynamicInvoke(0)); } private static Delegate ComposeLambda(Delegate innerLambda) { Func outerLambda = i => i + 2; var parameter = Expression.Parameter(typeof (int)); var callInner = Expression.Call(innerLambda.GetMethodInfo(), parameter); var callOuter = Expression.Call(outerLambda.GetMethodInfo(), callInner); var composedLambdaType […]

从OrderBy中使用的方法返回表达式

我想编写一个由子类重写的抽象方法,该方法的作用是返回一个表达式,以便随后在LINQ OrderBy() 。 像这样的东西: 注意: Messageinheritance自Notes类, MyModelinheritance自MsgModel 。 public class Notes { // abstract definition; using object so that I can (I hope) order by int, string, etc. public abstract Expression<Func> OrderByField(); // … private string GetOrderByFieldName() { // I am not sure how to write this // This is my problem 2. Please see […]

如何创建具有表达式作为参数的通用表达式

ASP.Net MVC中有一个DisplayNameFor(x=>x.Title)帮助器。 我想在行为中实现类似的东西。 我想有一个方法接受基于User类( u=>u.Birthdate或u => u.Name)的表达式,一个操作数(Greater,Less,Equal)和一个像DateTime.Now这样的值并返回一个表达式u=>u.Birthdate > DateTime.Now 我知道我必须手工构建结果表达式。 我无法包裹的是传递和处理属性表达。 编辑: 我想调用一个类似的方法 GetFilterPredicate(u=>u.Birthdate,FilterOps.GreaterThan,DateTime.Parse(“01.01.2013”)或 GetFilterPredicate(u=>u.SomeIntProperty,FilterOps.Equals,2) 更新:我创建了一个包含此问题解决方案的repo以及一个集合属性过滤https://github.com/Alexander-Taran/Lambda-Magic-Filters

从属性名称的字符串创建表达式?

我正在尝试基于一些JSON创建查询,我目前将JSON解析为一组规则,每个规则包含字段的名称,比较的类型(=,> etc)和要比较的值。 我遇到的问题是从规则到IQueryable对象,我猜我需要使用reflection并以某种方式构建表达式树,但我不确定正确的方法…… 假设我有: public class Order : BaseEntity { public int OrderID{ get; set; } } 而我的规则是: public class Rule { public string field { get; set; } public Operations op { get; set; } public string data { get; set; } } 运行它我得到: field = “OrderID” op = “eq” data = “123” 我有方法用签名解析它: […]

转换表达式树

让它有: Expression<Func> exp1 = x => x.mesID == 1; Expression<Func> exp2 = x => x.mesID == 1; 现在我需要将exp1传递给_db.Messages.where(exp1); 问题是我只有exp2,我需要将类型转换为Message,所有属性都是一样的! 现在我这样做: var par = Expression.Parameter(typeof(Message)); var ex = (Expression<Func>)Expression.Lambda(exp2.Body, par); 问题是输入参数改变了是的! 但是lambda“x.mesID”正文中的x属于旧类型。 任何方式改变身体中的所有参数类型或改变输入参数,它反映身体呢? 我想这是我一直对LINQ的一个大问题,因为在层之间我不能传递生成的类,因为这将使层耦合,所以我必须制作轻量级类,现在我如何使用像_db.Messages这样的方法。哪里(); 从busiess层?!! 虽然busniess层对Message类型一无所知,但它只知道MessageDTO。

使用3个条件创建Lambda表达式

我想为此动态创建一个lambda表达式: (o => o.Year == year && o.CityCode == cityCode && o.Status == status) 我写这个: var body = Expression.AndAlso( Expression.Equal( Expression.PropertyOrField(param, “Year”), Expression.Constant(year) ), Expression.Equal( Expression.PropertyOrField(param, “CityCode”), Expression.Constant(cityCode) ) , Expression.Equal( Expression.PropertyOrField(param, “Status”), Expression.Constant(status) ) ); 但对于这段代码: Expression.Equal( Expression.PropertyOrField(param, “Status”), Expression.Constant(status) ) 我收到一个错误: 无法从’System.Linq.Expressions.BinaryExpression’转换为’System.Reflection.MethodInfo’ 我如何为lambda表达式添加3个条件?

LINQ表达式中不区分大小写的字符串比较

我正在尝试编写一个ExpressionVisitor来包装我的LINQ到对象表达式,以自动使它们的字符串比较不区分大小写,就像它们在LINQ-to-entities中一样。 编辑:我确实想要使用ExpressionVisitor,而不是仅仅在创建它时为我的表达式应用一些自定义扩展或其他一些重要原因:传递给我的ExpressionVisitor的表达式是由ASP.Net Web API ODATA层生成的,所以我无法控制它是如何生成的(即我不能小写它正在搜索的字符串,除非在此ExpressionVisitor中)。 必须支持LINQ to Entities。 不只是扩展。 这是我到目前为止所拥有的。 它在字符串上查找对“Contains”的调用,然后在该表达式内的任何成员访问上调用ToLower。 但是,它不起作用。 如果我在更改后查看表达式,它看起来对我来说是正确的,所以我不确定我可能做错了什么。 public class CaseInsensitiveExpressionVisitor : ExpressionVisitor { protected override Expression VisitMember(MemberExpression node) { if (insideContains) { if (node.Type == typeof (String)) { var methodInfo = typeof (String).GetMethod(“ToLower”, new Type[] {}); var expression = Expression.Call(node, methodInfo); return expression; } } return base.VisitMember(node); } private […]

如何从C#中的字符串创建基于动态lambda的Linq表达式?

我在从字符串创建基于Lambda的Linq表达式时遇到一些困难。 以下是使用此示例对象/类的基本情况: public class MockClass { public string CreateBy { get; set; } } 基本上我需要转换这样的字符串: string stringToConvert = “x => x.CreateBy.Equals(filter.Value, StringComparison.OrdinalIgnoreCase”; 进入谓词/ linq表达式: System.Linq.Expressions.Expression<Func> or in this example System.Linq.Expressions.Expression<Func> 所以它相当于下面Where方法中的Linq表达式: query = query.Where(x => x.CreateBy.Equals(filter.Value, StringComparison.OrdinalIgnoreCase)); 我已经尝试过使用以下帮助程序,但似乎无法弄清楚如何让它们在这种情况下工作,我希望能够从字符串中提前建立一个linq表达式: http:http: //www.albahari.com/nutshell/predicatebuilder.aspx http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx (它现在作为NuGet包提供很好地称为“DynamicQuery”)

子集合的表达式列表 .Any

我正在使用表达式树构建genericslinq查询。 在子集合上创建表达式时,我陷入困境。 由于类型不兼容,方法调用会爆炸。 通常我知道要放在那里,但Any()方法调用让我感到困惑。 我尝试了所有我能想到的类型而且没有运气。 任何帮助,将不胜感激。 这是我的实体类: public class Story : Entity { public string Author { get; set; } public IList Contributors { get; set; } } 我要生成表达式树的查询: var stories = new List(); stories.Where(p => p.Author.Contains(“Test”) || p.Contributors.Any(c => c.Contains(“Test”))); 到目前为止我得到了什么 public interface IFilterCriteria { string PropertyToCompare { get; set; } object ValueToCompare { […]

使用多个字段构建GroupBy表达式树

要动态生成GroupBy表达式,我正在尝试构建Linq表达式树。 要分组的字段是动态的,可以在数量上有所不同。 我用这个代码: string[] fields = {“Name”, “Test_Result”}; Type studentType = typeof(Student); var itemParam = Expression.Parameter(studentType, “x”); var addMethod = typeof(Dictionary).GetMethod( “Add”, new[] { typeof(string), typeof(object) }); var selector = Expression.ListInit( Expression.New(typeof(Dictionary)), fields.Select(field => Expression.ElementInit(addMethod, Expression.Constant(field), Expression.Convert( Expression.PropertyOrField(itemParam, field), typeof(object) ) ))); var lambda = Expression.Lambda<Func<Student, Dictionary>>( selector, itemParam); 代码是从这篇文章复制而来的 (谢谢Mark Gravel!)。 最终确定…… var currentItemFields […]