Tag: 表达式树

要在Select()查询中使用的Lambda表达式

我正在尝试构建一个lambda表达式,包含两个赋值(如下图所示),然后我可以传递给Queryable.Select()方法。 我试图将一个字符串变量传递给一个方法,然后使用该变量来构建lambda表达式,以便我可以在LINQ Select查询中使用它。 我的理由是我有一个包含许多列名的SQL Server数据源,我正在创建一个图表应用程序,允许用户通过输入列名来选择他们想要查看的实际数据列。我的图表的y轴,x轴始终是DateTime。 因此,他们基本上可以根据DateTime值选择他们绘制的数据(它是数据仓库类型的应用程序)。 例如,我有一个类来存储检索到的数据,因此用作以下图表来源: public class AnalysisChartSource { public DateTime Invoicedate { get; set; } public Decimal yValue { get; set; } } 我(纯实验)使用String值为Where子句构建了一个表达式树,并且工作正常: public void GetData(String yAxis) { using (DataClasses1DataContext db = new DataClasses1DataContext()) { var data = this.FunctionOne().AsQueryable(); //just to get some temp data in…. ParameterExpression pe = Expression.Parameter(typeof(AnalysisChartSource), “p”); […]

如何使用Linq表达式树从Span 中获取值?

我想使用Linq表达式树来调用Span的索引器。 代码如下: var spanGetter = typeof(Span) .MakeGenericType(typeof(float)).GetMethod(“get_Item”); var myFloatSpan = Expression.Parameter(typeof(Span), “s”); var myValue = Expression.Call( myFloatSpan, spanGetter, Expression.Constant(42)); var myAdd = Expression.Add( myValue, Expression.Constant(13f)); 然而,此代码失败,因为myValue类型为Single& (aka ref struct )而不是Single (aka struct )。 如何从表达式树中评估Span ?

表达式树和调用委托

所以我有一个delegate指向一些我在第一次创建delegate对象时实际上并不知道的函数。 稍后将该对象设置为某个函数。 然后我还想创建一个表达式树,用参数调用委托(为了这个问题,参数可以是5 )。 这是我正在努力的一点; 下面的代码显示了我想要的但它没有编译。 Func func = null; Expression expr = Expression.Invoke(func, Expression.Constant(5)); 对于这个例子我可以这样做(这很实用,因为我需要在运行时构建表达式树): Func func = null; Expression<Func> expr = () => func(5); 这使expr成为: () => Invoke(value(Test.Program+c__DisplayClass0).func, 5) 这似乎意味着要使用delegate func ,我需要生成value(Test.Program+c__DisplayClass0).func位。 那么,我怎样才能创建一个调用委托的表达式树?

MemberBinding LINQ表达式的一些示例是什么?

有三种可能性,但我找不到例子: System.Linq.Expressions.MemberAssignment System.Linq.Expressions.MemberListBinding System.Linq.Expressions.MemberMemberBinding 我想写一些unit testing,看看我是否可以处理它们,但我不知道怎么写它们除了第一个,它似乎是new Foo { Property = “value” }其中Property =“value”是MemberAssignment类型的MemberAssignment 。 另请参阅此MSDN文章 。

Lambda表达式树解析

我试图在项目中使用Lambda表达式映射到第三方查询API。 所以,我正在手工解析Expression树。 如果我传入一个lambda表达式,如: p => p.Title == “title” 一切正常。 但是,如果我的lambda表达式如下: p => p.Title == myaspdropdown.SelectedValue 使用.NET调试器,我没有看到该函数的实际值。 相反,我看到类似的东西: p => p.Title = (value(ASP.usercontrols_myaspusercontrol_ascx).myaspdropdown.SelectedValue) 是什么赋予了? 当我尝试将表达式的右侧作为字符串抓取时,我得到(value(ASP.usercontrols_myaspusercontrol_ascx).myaspdropdown.SelectedValue)而不是实际值。 我如何获得实际价值?

用表达式树读取对象的属性

我想为动态读取值的Object的每个属性创建一个Lambda表达式。 到目前为止我所拥有的: var properties = typeof (TType).GetProperties().Where(p => p.CanRead); foreach (var propertyInfo in properties) { var getterMethodInfo = propertyInfo.GetGetMethod(); var entity = Expression.Parameter(typeof (TType)); var getterCall = Expression.Call(entity, getterMethodInfo); var lambda = Expression.Lambda(getterCall, entity); var expression = (Expression<Func>) lambda; var functionThatGetsValue = expression.Compile(); } 只要“TypeOfProperty”是硬编码的,当我调用functionThatGetsValue时,代码运行良好。 我知道我无法动态传递“TypeOfPoperty”。 我能做些什么来实现我的目标?

如何获取使用局部变量的ConstantExpression的值?

我创建了一个覆盖VisitConstant的ExpressionVisitor实现。 但是,当我创建一个利用局部变量的表达式时,我似乎无法获得变量的实际值。 public class Person { public string FirstName { get; set; } } string name = “Michael”; Expression<Func> exp = p => p.FirstName == name; 我如何在ConstantExpression中获取变量“name”的值? 我唯一能想到的是: string fieldValue = value.GetType().GetFields().First().GetValue(value).ToString(); 显然,这并不适合非常灵活…. 稍微复杂的例子如下: Person localPerson = new Person { FirstName = “Michael” }; Expression<Func> exp = p => p.FirstName == localPerson.FirstName;

创建一个Action 来“设置”一个属性,当我为“get”提供LINQ表达式时

我希望能够生成一个已编译的表达式来设置属性,给定lambda表达式为属性提供“get”方法。 这是我正在寻找的: public Action CreateSetter(Expression<Func> getter) { // returns a compiled action using the details of the getter expression tree, or null // if the write property is not defined. } 我仍然试图理解各种类型的表达式类,所以如果你能指出我正确的方向,这将是伟大的。

Serialize.Linq在WCF代理层中不起作用

我使用Serialize.Linq发送并在WCF应用程序服务中的客户端和服务器之间接收Expression<Func>查询,因为Expression<Func>无法序列化 一切似乎都很好但是 当我添加引用此库到wcf代理层并添加服务器引用我的Web服务 构建我的项目时会遇到这样的错误 ExpressionNodeOfNewExpressionQsd8_SODT’ does not implement inherited abstract member ‘Serialize.Linq.Nodes.ExpressionNode.ToExpression(Serialize.Linq.ExpressionContext)’ ExpressionNodeOfTypeBinaryExpressionQsd8_SODT’ does not implement inherited abstract member ‘Serialize.Linq.Nodes.ExpressionNode.ToExpression(Serialize.Linq.ExpressionContext)’ etc … 似乎WCF为这个库创建自动生成的代理类而不是使用主类,而我将参考Serialize.Linq程序集添加到代理项目但没有帮助解决我的问题 您可以非常简单地测试并显示此问题 像这样 创建Wcf服务应用程序并将参考Serialize.Linq添加到项目 public interface IService1 { [OperationContract(Name = “GetByPredicate”)] List Get(ExpressionNode expression); [OperationContract] List Get(); } public class Person { public int ID { get; set; } public string Name { […]

使用ExpressionTree分配属性

我正在尝试将属性赋值作为表达式树传递给方法。 该方法将调用表达式以便正确分配属性,然后嗅出刚刚分配的属性名称,以便我可以引发PropertyChanged事件。 我的想法是,我希望能够在我的WPF ViewModel中使用超薄自动属性,并且仍然会触发PropertyChanged事件。 我是ExpressionTrees的无知者,所以我希望有人可以指出我正确的方向: public class ViewModelBase { public event Action PropertyChanged = delegate { }; public int Value { get; set; } public void RunAndRaise(MemberAssignment Exp) { Expression.Invoke(Exp.Expression); PropertyChanged(Exp.Member.Name); } } 问题是我不知道怎么称呼它。 编译器拒绝了这种天真的尝试,原因是我肯定对任何能够回答这个问题的人都很明显: ViewModelBase vm = new ViewModelBase(); vm.RunAndRaise(() => vm.Value = 1); 编辑 谢谢@svick的完美答案。 我移动了一个小东西,并将其作为一种扩展方法。 以下是unit testing的完整代码示例: [TestClass] public class UnitTest1 { […]