Tag: 表达式树

LINQ表达树是否适合树木?

LINQ表达树是否适当的树,如图,(有针对性或没有,维基百科似乎不太一致)没有循环? 以下C#表达式中表达式树的根是什么? (string s) => s.Length 表达式树看起来像这样,“ – >”表示可通过其他节点访问的节点的属性名称。 ->Parameters[0] Lambda———Parameter(string s) \ / \->Body /->Expression \ / Member(Length) 使用ExpressionVisitor访问LambdaExpression时,将访问ParameterExpression两次。 有没有办法使用ExpressionVisitor访问LambdaExpression,以便所有节点只访问一次,并以特定的,众所周知的顺序(预订,有序,后订单等)?

将已编译的lambda表达式用于Average时的NotSupportedException

我试图回答这个问题,但失败了: 那么我们来看看原始查询: var result = db.Employees.GroupBy(x => x.Region) .Select(g => new { Region = g.Key, Avg = g.Average(x => x.BaseSalary)}); 工作良好。 现在我们想要动态决定平均值。 我尝试动态创建lambda的lambda: string property = “BaseSalary”; var parameter = Expression.Parameter(typeof(Employee)); var propAccess = Expression.PropertyOrField(parameter, property); var expression = (Expression<Func>)Expression.Lambda(propAccess, parameter); var lambda = expression.Compile(); 并使用它: var result = db.Employees.GroupBy(x => x.Region) .Select(g => new […]

深度> 1的成员访问的表达式树

public class Job { public string Name { get; set; } public int Salary { get; set; } } public class Employee { public string Name { get; set; } public Job Job { get; set; } } 如果我想创建一个成员访问Employee.Name的表达式树,这就是我所做的: var param = Expression.Parameter(type, “x”); var memberAccess = Expression.PropertyOrField(param, memberName); return Expression.Lambda<Func>(memberAccess, param); 对Employee.Job.Salary的成员访问权限相当于什么?

理解表达式树和参数评估

我正在尝试修改一个动态构建Contains表达式的表达式树,最终会产生类似SQL的表达式 P IN (123, 124, 125, 200, 201) 而是检查执行范围检查,最终导致SQL像 (P >= 123 AND P = 200 AND P <= 201) 我的解决方案基于这篇文章 。 static public Expression<Func> BuildContainsExpression( Expression<Func> valueSelector, IEnumerable values) { // Removed for post: Input checks and edge cases var equals = values.Select(value => (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof(TValue)))); var body = equals.Aggregate((accumulate, equal) => Expression.Or(accumulate, […]

有点理解.NET中的表达式树

我已经阅读了几篇关于表达式树的文章和几篇stackoverflow.compost。 它让我的大脑明白了。 问题: 1)与DOM(文档对象模型)一样,它是逻辑的内存表示吗? 2)有人解释说这是一种将可执行​​代码转换为数据的机制,使用它可以生成代表代码的数据结构。 是否意味着,表达式树用于设计用户定义的模式? 3)大多数示例将表达式树与Func委托或其他委托结合使用,因此使用委托和其他编程构造不能实现与表达式服务相同的function。 初学者可以理解的解释非常感谢。

动态MemberExpression

我想创建一个只知道字段名称的MemberExpression; 例如: public static Expression<Func> GenerateMemberExpression(string fieldName) { PropertyInfo fieldPropertyInfo; fieldPropertyInfo = typeof(TModel).GetProperty(fieldName); var entityParam = Expression.Parameter(typeof(TModel), “e”); // {e} var columnExpr = Expression.MakeMemberAccess(entityParam, fieldPropertyInfo); // {e.fieldName} var lambda = Expression.Lambda(columnExpr, entityParam) as Expression<Func>; // {e => e.column} return lambda; } 上述问题是字段类型必须是强类型的。 将“对象”作为字段类型传递不起作用。 有没有办法生成这个? 甚至动态LINQ似乎也不起作用。

使用表达式树构造LINQ GroupBy查询

我已经坚持这个问题一个星期,没有找到解决方案。 我有一个像下面的POCO: public class Journal { public int Id { get; set; } public string AuthorName { get; set; } public string Category { get; set; } public DateTime CreatedAt { get; set; } } 我想知道在特定日期范围内(按月或年分组)期刊的数量由AuthorName或Category计算。 在我将查询对象发送到JSON序列化程序之后,然后生成如下的JSON数据(仅使用JSON来演示我想要获取的数据,如何将对象序列化为JSON不是我的问题) data: { ‘201301’: { ‘Alex’: 10, ‘James’: 20 }, ‘201302’: { ‘Alex’: 1, ‘Jessica’: 9 } } 要么 […]

使用表达式树为LINQ查询构建IQueryable.Any

我正在使用System.Linq.Expressions.Expression类动态构建SQL“WHERE”子句。 它适用于简单的子句,例如添加“PhaseCode = X”子句,我执行以下操作: var equalTarget = Expression.Constant(phaseCode, typeof(int?)); var phaseEquals = Expression.Equal(Expression.PropertyOrField(projParam, “PhaseCode”), equalTarget); 但是,现在我正在尝试构建一个表达式,如果项目已分配给特定组,则该表达式将返回记录。 项目和集团有多对多的关系。 如果没有表达式树,我会按如下方式执行: db.Projects.Where(p => …. && p.GroupsAssigned.Any(g => g.ID == groupId)) 但是,我似乎无法找到表达类的方法。 实际上有两件我无法弄清楚的事情: 如何遍历表之间的关系 如何做x.Any() 任何帮助是极大的赞赏。

从Linq表达式获取参数值

我有以下课程 public class MyClass { public bool Delete(Product product) { // some code. } } 现在我有一个看起来像这样的助手类 public class Helper { public Type Type; public string Method; public Type[] ArgTypes; public object[] ArgValues; public Helper(Expression<Func> expression) { var body = (System.Linq.Expressions.MethodCallExpression)expression.Body; this.Type = typeof(T); this.Method = body.Method.Name; this.ArgTypes = body.Arguments.Select(x => x.Type).ToArray(); this.ArgValues = ??? } […]

使用LinqExpressions构建MicroRuleEngine

所以我正在构建一个MicroRuleEngine(很想看到它作为一个OpenSource项目起飞)并且我遇到了一个空引用错误在执行编译的ExpressionTree时我并不完全确定原因。 针对简单属性的规则有效,但是针对Child Properties又称Customer.Client.Address.StreetName等不起作用。 以下是MicroRuleEngine using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Linq.Expressions; namespace Trial { public class MicroRuleEngine { public bool PassesRules(List rules, T toInspect) { bool pass = true; foreach (var rule in rules) { var cr = this.CompileRule(rule); pass = pass && cr.Invoke(toInspect); if (!pass) return pass; } return pass; } […]