Tag: expression trees

如何从()=> foo.Title表达式获取对象实例

我有一个带有属性的简单类 class Foo { string Title { get; set; } } 我试图通过调用函数来简化数据绑定 BindToText(titleTextBox, ()=>foo.Title ); 这被宣布为 void BindToText(Control control, Expression<Func> property) { var mex = property.Body as MemberExpression; string name = mex.Member.Name; control.DataBindings.Add(“Text”, ??? , name); } 那我该怎么办??? 对于我的Foo类的实例。 如何从lambda表达式中获取对调用foo实例的引用? 编辑:实例应该在某处,因为我可以调用property.Compile()并创建一个在我的BindToText函数中使用foo实例的委托。 所以我的问题是,如果可以在不添加函数参数中实例的引用的情况下完成此操作。 我呼吁Occum的Razor提供最简单的解决方案。 编辑2:许多人没有注意到的是在我的函数中访问foo实例时存在的闭包 ,如果我编译lambda。 为什么编译器知道在哪里找到实例,我不知道? 我坚持认为必须有一个答案, 而不必通过额外的论证。 解 感谢VirtualBlackFox的解决方案是这样的: void BindText(TextBoxBase text, Expression<Func> property) […]

表达式的反转<Func >。编译()?

既然我们可以: Expression<Func> predicate = x => x > 5; var result = Enumerable.Range(0,10).Where(predicate.Compile()); 我怎么能够: Func predicate = x => x > 5; Expression<Func> exp = predicate.Decompile(); 也就是说,我想得到相应的Func Expression 。 可能吗?

entity framework+ DayOfWeek

使用System.Linq.Dynamic (在这里管理https://github.com/kahanu/System.Linq.Dynamic ),我试图捕获在DateTime上找到的DayOfWeek字段,以便使用Entity Framework 6(或更高版本)进行聚合。 以前要求类似的东西,这有很大帮助, 动态Linq +entity framework:动态选择的日期时间修改 entity framework支持使用the获取DayOfWeek SqlFunctions.DatePart(“dw”, datetime?) 或者我们可以用类似的东西做一些更需要的东西 DbFunctions.DiffDays(date?, date?). 理念: 让Linq的DayOfWeek成为实体 我发现这非常有趣,我喜欢它,因为它不使用可能让我局限于SQL Server的SqlFunctions 。 此外,开发人员可以控制一周的第一天,而无需查询SQL Server属性以查找其配置方式(第一天)。 出于实验目的,我一直在尝试在VisitMember()覆盖中实现它: protected override Expression VisitMember(MemberExpression node) { if (node.Type == typeof(System.DayOfWeek)) { var firstSunday = new DateTime(1753, 1, 7); var firstSundayExpression = Expression.Constant(firstSunday, typeof(DateTime?)); var timeValue = node.Expression; if (timeValue.Type != typeof(DateTime?)) […]

在运行时使用新的匿名类型创建lambda表达式

我想调用一个需要这样的参数的方法: Expression<Func> expr 我需要在运行时构造这个参数,因为我不知道匿名类型之前会是什么样子; 它可以有任何数量的字段: x => new { a=xa, b=xb, c=xc, etc… } 我可以在运行时创建一个具有相同“签名”的类型(这是正确的词吗?)作为所需的匿名类型,但问题是:如何在运行时从那个构造这个lambda表达式? 特别是Expression.New让我烦恼,因为我需要传递一个构造函数信息,我必须从现有类型传递它(它确实可以是一个匿名类型,但我不能在运行时创建一个匿名类型。或者是否存在一种方法吗?)。 更新 (评论中要求的某些上下文) 我想调用的方法是: DependentNavigationPropertyConfiguration.HasForeignKey(Expression<Func> foreignKeyExpression) 我想这样做的原因是自动为从某个基类inheritance的实体创建一个导航属性,包括该外键中该基类的键。 因为实体可以有多个任何类型的键字段,所以TKey类型只在运行时才为我所知。

基于子实体的属性构建OrderBy Lambda表达式

我正在尝试使用lambda表达式生成LINQ OrderBy子句,其中实体的列名称作为字符串的输入(在下面的“sortOn”变量中)。 下面的代码适用于sortOn值,如生成lambda的“Code” p => p.Code 但我还想对lambda可能存在的子实体进行排序 p => p.Category.Description 所以在这个例子中,我只想设置sortOn =“Category.Description”并生成正确的lamdba表达式。 这可能吗? 有关最佳方法的任何建议都会受到欢迎。 此代码适用于简单的情况: var param = Expression.Parameter(typeof (Product), “p”); var sortExpression = Expression.Lambda<Func>( Expression.Property(param, sortOn), param); if (sortAscending ?? true) { products = products.OrderBy(sortExpression); } else { products = products.OrderByDescending(sortExpression); } 此问题的用例是显示数据网格并能够对数据进行排序,只需将要排序的列名称传递回服务器即可。 我想使解决方案通用,但现在已开始使用特定类型(示例中的产品)。

如何使用F#lambda创建Linq表达式树?

以下是C#中可以做的事情 – var two = 2; System.Linq.Expressions.Expression<System.Func> expr = x => x * two; expr.Compile().Invoke(4); // returns 8 我希望在F#中做到精确的等价物。 这是我尝试过的,但没有编译 – let two = 2 let expr = (fun x -> x * two) : System.Linq.Expressions.Expression<System.Func> expr.Compile().Invoke(4) // desired to return 8 也许可以预见,编译在第2行失败,出现以下错误 – “This function takes too many arguments, or is used in a […]

表达式树复制或转换

如何转换表单的ExpressionTree Expression<Func> exp = p => p.Age > 50; 至 Expression<Func> exp2 = p => p.Age > 50; 其中POCO1和POCO2是C#对象,并且都具有Int32 Age属性

LinqKit System.InvalidCastException在成员属性上调用方法提供的表达式时

给定一个简单的父/子类结构。 我想使用linqkit在父级上应用子lambda表达式。 我还希望Lambda表达式由实用程序方法提供。 public class Foo { public Bar Bar { get; set; } } public class Bar { public string Value { get; set; } public static Expression<Func> GetLambdaX() { return c => c.Value == “A”; } } … Expression<Func> lx = c => Bar.GetLambdaX().Invoke(c.Bar); Console.WriteLine(lx.Expand()); 上面的代码抛出 System.InvalidCastException: Unable to cast object of type […]

声明Func 动态

考虑一下: var propertyinfo = typeof(Customer).GetProperty(sortExpressionStr); Type orderType = propertyinfo.PropertyType; 现在我想宣布 Func 我知道它不可能直接因为ordertype是在运行时但有任何解决方法吗? 这正是我想要做的: var propertyinfo = typeof(T).GetProperty(sortExpressionStr); Type orderType = propertyinfo.PropertyType; var param = Expression.Parameter(typeof(T), “x”); var sortExpression = (Expression.Lambda<Func> (Expression.Convert(Expression.Property(param, sortExpressionStr), typeof(orderType)), param)); 这一切都是因为我想转换: Expression<Func> to Expression<Func> 或者如果它不可能那么我想从正确的类型的第一个地方创建它,案例如下: 我在一个方法里面有一个type(Customer)和一个我希望按其订购的类型的属性名称,我想创建一个排序表达式树来将它传递给Orderby (这里)。

PredicateBuilder是如何工作的

Nutshell中的C#有一个名为PredicateBuilder的免费类,它可以在这里逐个构造LINQ谓词。 这是该方法的一个摘录,它为谓词添加了一个新表达式。 有人可以解释一下吗? (我已经看到了这个问题 ,我不想在那里得到一般答案。我正在寻找Expression.Invoke和Expression.Lambda如何构建新表达式的具体解释)。 public static Expression<Func> And (this Expression<Func> expr1, Expression<Func> expr2) { var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast ()); return Expression.Lambda<Func> (Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters); }