Tag: expression trees

表达树和可空类型

我一直在玩表情树。 我有以下简单方法,通过动态创建表达式树来执行查询。 ItemType是数据库中的可空int, 也是EF实体类中的可空int。 出于某种原因虽然查询引发了错误 未处理的exception:System.InvalidOperationException:没有为类型’System.Nullable`1 [System.Int32]’和’System.Int32’定义二进制运算符Equal。 我不认为我要求EF转换任何东西。 我的参数定义为int? ,这是我认为它应该是。 注意,我看过这个 在表达式树中使用可空类型 但是这个家伙试图传入他的可以作为对象输入的可以为空的int值,我猜这个EF有问题。 我实际上是从头开始宣布这是正确的类型。 public void GetResultCollection() { MyEntities db = new MyEntities(); var result = db.CreateQuery(String.Format(“[{0}]”, typeof(T).Name + “s”)); int? ItemTypeValue = 1; var param = Expression.Parameter(typeof(T)); var lambda = Expression.Lambda<Func>( Expression.Equal( Expression.Property(param, “ItemType”), Expression.Constant(ItemTypeValue)), param); var list = result.Where(lambda).ToList(); } 编辑 我也尝试了ItemTypeValue.Value – […]

如何使用多个条件构建Lambda表达式树

注意:我知道使用动态linq创建它很简单,但我想学习。 我想创建一个“找到”的lambda:Name = David AND Age = 10。 class Person { public int Age { get; set; } public string Name { get; set; } } var lambda = LabmdaExpression(“Name”, “David”, “Age”, 10); static Expression<Func> LabmdaExpression(string property1, string value1, string property2, int value2) { ParameterExpression parameterExpression = Expression.Parameter(typeof(Person), “o”); MemberExpression memberExpression1 = Expression.PropertyOrField(parameterExpression, property1); MemberExpression […]

在表达式树中使用可空类型

我有一个扩展方法,使用字符串值动态过滤Linq到实体结果。 它工作正常,直到我用它来过滤可空列。 这是我的代码: public static IOrderedQueryable OrderingHelperWhere(this IQueryable source, string columnName, object value) { ParameterExpression table = Expression.Parameter(typeof(T), “”); Expression column = Expression.PropertyOrField(table, columnName); Expression where = Expression.GreaterThanOrEqual(column, Expression.Constant(value)); Expression lambda = Expression.Lambda(where, new ParameterExpression[] { table }); Type[] exprArgTypes = { source.ElementType }; MethodCallExpression methodCall = Expression.Call(typeof(Queryable), “Where”, exprArgTypes, source.Expression, lambda); return (IOrderedQueryable)source.Provider.CreateQuery(methodCall); } […]

转换包含到表达式树

相关: 创建具有3个条件的Lambda表达式 请考虑以下代码: from a in myTbl where a.Address.Contains(strToCheck) select a 我如何将其转换为表达式树并使用表达式编写上面的代码? 主要问题是将a.Address.Contains(strToCheck)转换为Expression Tree 。 编辑1)地址是一个string字段, strToCheck是一个string 谢谢

LinqKit的扩展器是否有一个特殊原因无法从字段中获取表达式?

我正在使用LinqKit库,它允许动态组合表达式。 这是编写Entity Framewok数据访问层的纯粹幸福,因为可以选择重复使用和组合多个表达式,这样就可以实现可读和高效的代码。 考虑以下代码: private static readonly Expression<Func> _selectMessageViewExpr = ( Message msg, int requestingUserId ) => new MessageView { MessageID = msg.ID, RequestingUserID = requestingUserId, Body = ( msg.RootMessage == null ) ? msg.Body : msg.RootMessage.Body, Title = ( ( msg.RootMessage == null ) ? msg.Title : msg.RootMessage.Title ) ?? string.Empty }; 我们声明了一个将Message投影到MessageView上的表达式(为了清楚起见,我删除了细节)。 现在,数据访问代码可以使用此表达式来获取单个消息: […]

使用ExpressionVisitor获取所有“where”调用

我有一个查询,像这样: var query = from sessions in dataSet where (names.Contains(sessions.Username)) where (sessions.Login.TimeOfAction == dt) select new { sessions.Username, sessions.Login, sessions.Logout, sessions.Duration }; 我想实现一个ExpressionVisitor来提取where子句作为Lambda,但到目前为止只能使用一个名为’InnermostWhereFinder’的类来获得第一个,该类来自TerraServer Web服务的自定义查询提供程序上的MSDN教程。 它是: internal class InnermostWhereFinder : ExpressionVisitor { private MethodCallExpression innermostWhereExpression; public MethodCallExpression GetInnermostWhere(Expression expression) { Visit(expression); return innermostWhereExpression; } protected override Expression VisitMethodCall(MethodCallExpression expression) { if (expression.Method.Name == “Where”) innermostWhereExpression = […]

使用Dyanmic字段名称使用LINQ查询实体

我在ASP.NET MVC中创建了一个动态搜索屏幕。 我通过reflection从实体中检索了字段名称,这样我就可以允许用户选择要搜索的字段而不是显示视图中的所有字段。 当搜索结果回发到控制器时,我收到一个包含FieldName和Value的FormCollection。 我不知道搜索了多少字段,FormCollection只包含用户选择的字段。 我希望能够现在获取该字段名称,并在我查询数据库时将其应用于我的LINQ语句,例如: public List SearchPeople(Dictionary fieldValueDictionary) { List searchResults = new List(); foreach (string key in fieldValueDictionary.Keys) { searchResults.Add(entities.People.Where(p => p. == fieldValueDictionary[key])); } return searchResults; } 我在“使用键字符串作为fieldName”的地方就像p => p.FirstName == fieldValueDictionary [key]其中key =“FirstName”。 我尝试过但未能使用Lambda表树,并且在动态LINQ方面取得了一些成功。 唯一的另一种选择是做类似的事情: public List SearchPeople(Dictionary fieldValueDictionary) { IQueryable results = entities.People; foreach (string key in fieldValueDictionary.Keys) { […]

C#4.0:表达式树与CodeDom

Expression树和CodeDom有什么区别? 我应该在哪种情况下使用哪个?

C#如何将Expression <Func >转换为Expression <Func >

我之前使用过基于lamdas的C#表达式,但我没有手工编写它们的经验。 给定一个Expression<Func> originalPredicate ,我想创建一个Expression<Func> translatedPredicate 。 在这种情况下,SomeType和OtherType具有相同的字段,但它们不相关(没有inheritance而不是基于公共接口)。 背景:我有一个基于LINQ to SQL的存储库实现。 我将LINQ to SQL实体投影到我的Model实体,以便将我的模型保存在POCO中。 我想将表达式传递给存储库(作为规范的一种forms),但它们应该基于模型实体。 但我无法将这些表达式传递给数据上下文,因为它需要基于LINQ to SQL实体的表达式。

C#,Linq2Sql:是否可以将两个可查询连接成一个?

我有一个可查询的地方,我使用各种Where和WhereBetween语句将集合缩小到某个集合。 现在我需要添加一个Where || WhereBetween Where || WhereBetween 。 换句话说,我不能像现在一样把它们连在一起,因为它可以作为一个And。 那么,我该怎么做呢? 我看到两种可能性: 从我拥有的一个查询中创建两个查询 ,一个使用Where ,一个使用WhereBetween 。 然后将它们连接起来 。 不知道这是否可能? 此外,虽然不是在我的特定情况下,你很可能最终会重复… 以某种方式合并Where表达式和WhereBetween创建的表达式 。 首先,如上所述,我不确定是否可能。 如果是的话,我不太确定这是一个很好的方法。 第二,我可以看到一个选项,但不完全确定所有的细节。 下面是我的另一个问题中的WhereBetween方法,我现在使用它并且效果很好: public static IQueryable WhereBetween( this IQueryable source, Expression<Func> selector, IEnumerable<Range> ranges) { var param = Expression.Parameter(typeof(TSource), “x”); var member = Expression.Invoke(selector, param); Expression body = null; foreach (var range in […]