Tag: expression trees

如何创建一个动态的“包含或LIKE”表达式,以便与Linq一起使用OData服务

我尝试使用System.Linq.Expressions.Expression(WPF / c#4.0)创建动态查询工具。它针对OData服务运行。 到目前为止,只要我限制条件构建在Equal(..),GreaterThan(..)等选项中,所有这些都是有效的。似乎没有构建contains / Like条件,所以我尝试构建自己的。 那里已经有一些文章了。 我试过的一个是如何为Like创建一个System.Linq.Expressions.Expression? 。 现在,如果我使用上面的解决方案,结果where表达式 whereCallExpression = {Convert([10000]).Expand(“A,B”).Where(clt => MyLike(clt.LastName, “te”))}’ 这很好,但错了,因为它没有转化为有效的Odata查询。 如果我使用条件’Equal’,结果是 whereCallExpression = {Convert([10000]).Expand(“A,B”).Where(clt => (clt.LastName == “te”))} 这导致OData查询 results = {http://…/Clients()?$filter=LastName eq ‘te’&$expand=A,B} 并按预期工作。 我是否在解决方案的实施方面出了问题,或者它不能与OData一起使用? 它应该转移到类似…?$filter=substringof(‘te’, LastName ) eq true 有关如何解决此问题的任何解决方案 问候 安德烈亚斯 PS,我在静态类中实现了解决方案扩展,我改变的是从’Like’到’MyLike’的被调用方法的名称。此外,因为用于构建表达式的代码适用于任何内置条件,我想,现在这部分还可以。 如果需要,我可以发布部分内容

使用多个属性构建动态GroupBy选择器表达式树

我将为GroupBy构建一个动态表达式树。 我想要实现的就是这样。 var NestedGrouped = listOfPerson.GroupByMany(x => x.Name,x=>x.Age).ToList(); 我的人员类似: – class Person { public string Name{ get; set; } public int Age{ get; set; } public float Salary{ get; set; } } public class GroupResult { public object Key { get; set; } public int Count { get; set; } public IEnumerable Items { get; […]

使用表达式树的动态查询

我有一个表单,用户将从下拉列表中选择以下内容: table_name columnName_to_sort_by columnName_to_search_in 用户应在文本框中输入Search_text 表格应从许多表格中提取数据。 我想避免编写排序并搜索每个表的每个字段。 这就是我想使用表达式树的原因。 我想动态构建查询。 我想编写一个generics方法,它将为select , where和orderby方法生成表达式树,具体取决于用户输入。 我可以使用System.Reflection来获取正在查询的Type (我的所有表都是类型 – 我使用的是LinqToSql)。 我不知道如何形成表达式树。 这是我到目前为止所拥有的: private static List GetSortedData( string sortColumnName) { var type = typeof(T); var property = type.GetProperty(sortColumnName); var parameter = Expression.Parameter(type, “p”); var propertyAccess = Expression.MakeMemberAccess(parameter, property); var orderByExp = Expression.Lambda(propertyAccess, parameter); MethodCallExpression resultExp = Expression.Call(typeof(Queryable), “OrderBy”, new Type[] […]

从属性中检索表达式并将其添加到表达式树中

我试图简化这个例子,因为我正在使用的实际代码更复杂。 所以虽然这个例子看起来很傻,但请耐心等待。 假设我正在使用AdventureWorks数据库,我决定在Product表中添加一个名为Blarg的属性,该表返回一个表达式,其中包含我想在几个地方使用的代码: public partial class Product { public Expression<Func> Blarg { get { return product => product.ProductModelID.HasValue ? “Blarg?” : “Blarg!”; } } } 我想要做的是创建一个表达式表达式树,让它从Product.Blarg获取Expression,并按结果分组。 像这样的东西: var productParameter = Expression.Parameter(typeof(Product), “product”); // The Problem var groupExpression = Expression.Lambda<Func>( Expression.Invoke( Expression.Property(productParameter, “Blarg”), productParameter), productParameter); using (AdventureWorksDataContext db = new AdventureWorksDataContext()) { var result = db.Products.GroupBy(groupExpression).ToList(); […]

我能否以某种方式评估表达式以确定并可能设置null属性?

我有一个服务,它接受一个对象,并根据其中的属性将执行不同的操作; 使用此任何这些属性都可以为null,这意味着不执行此操作。 我正在尝试创建一个非常简单的API,以便在某些属性可以是多个级别的情况下执行此操作,这是当前实现的示例 service.PerformActions(DataFactory.GetNewData ( data => data.SomeParent = DataFactory.GetNewData(), data => data.SomeParent.SomeProperty = “someValue” )); 这是一个略微简化的版本,在实际情况下,我有时必须以这种方式设置多个父属性,以便在底部设置一个字符串属性。 我想要做的是调整GetNewData方法中的代码来处理根据需要实例化这些属性,以便代码看起来像这样: service.PerformActions(DataFactory.GetNewData ( data => data.SomeParent.SomeProperty = “someValue” )); 这是我目前的GetNewData代码: public static T GetNewData(params Action[] actions) { var data = Activator.CreateInstance(); foreach (var action in actions) { try { action(data); } catch (NullReferenceException) { throw new Exception(“The property […]

在另一个表达式中评估C#表达式

我想在另一个中使用表达式: Expression<Func> f = x => x * x * 27 + blah … expression with x; Expression<Func> g = y => 3 + 8 * f.Compile()(y) * y * blah… expression with y and f(y); 这在发送到LINQ to SQL时不起作用,因为SQL不知道f.Compile()。 如何在不编译变量y情况下计算变量y上的表达式f ,但是仍然使用常规语法来定义g ? 我不想用一些不可读的Expression.Add / Expression.Multiply等语句来定义所有g 。 谢谢。

组合多个表达式以动态创建包含表达式的select表达式作为getter

给出两个表达式的输入,例如: Expression<Func> nameExpression = x=>x.Name; Expression<Func> nameExpression = x=>x.MarketSegment.Name; 和a IQueryable query = ..//fetch from dbContext; 我想动态创建一个表达式,从查询中选择这些属性。 最终结果必须执行如下: Expression<IQueryable,IQueryable> query = query.Select(x=>new{ x=>x.Name, x=>x.MarketSegment.Name }); 我发现Expression.New可能是这个问题的一个选项,但我无法弄清楚如何将表达式传递给它。

Linq:使用表达式树语法按多列分组

我想更改以下代码,以便处理超过1个属性的分组 private Expression<Func> DynamicGroupBy(string propertyName) { var parameterExp = Expression.Parameter(typeof(ProfileResultView), “x”); var memberExp = Expression.PropertyOrField(parameterExp, propertyName); return Expression.Lambda<Func>(memberExp, parameterExp); } 所以这将被翻译成 GroupBy(x => new { x.Column1, x.Column2 }) 如何在表达式树语法中编写匿名类型?

从linq表达式中检索信息时是否使用了reflection?

我有以下扩展方法: public static string ToPropertyName(this Expression<Func> propertyExpression) { if (propertyExpression == null) return null; string propName; MemberExpression propRef = (propertyExpression.Body as MemberExpression); UnaryExpression propVal = null; // — handle ref types if (propRef != null) propName = propRef.Member.Name; else { // — handle value types propVal = propertyExpression.Body as UnaryExpression; if (propVal == null) throw […]

使用Irony实现前缀表示法表达式解析器

我正在尝试使用Irony库使用无上下文语法来解析用户输入的前缀表示法逻辑表达式。 这是一个课堂作业,所以如果有人恰好是这方面的专家,我很想知道更多。 我需要接受用户输入的以下格式的逻辑表达式: and PQ — (meaning P ^ Q) or PQ — (meaning P v Q) not P — (meaning ~P) imp PQ — (meaning P -> Q) 我正在尝试使用我在Irony中实现的无上下文语法将这些解析为表达式树。 我正在使用的无上下文语法在BNF中: ::= | | | | ::= “not” ::= “and” ::= “or” ::= “imp” ( is implemented as an IdentifierTerminal object). 我之前使用过Irony来解析表达式但由于某种原因,我无法让它工作。 当我输入表达式and PQ它似乎将“和”标识为标识符终端,而不是和非终结符号的一部分。 我可能会做一些显而易见的事情,但我根本无法理解。 […]