c# – 将对象的linq表达式应用于该对象是项目属性的项目列表(Wra
发布时间:2020-12-16 01:49:28 所属栏目:百科 来源:网络整理
导读:我需要能够将属性的表达式应用于该属性的包装器,下面是一个示例;一个数字列表和一个列表包装数字,表达式是[数字是偶数] using System;using System.Collections.Generic;using System.Linq;using System.Linq.Expressions;namespace ExpressionTest{ class P
我需要能够将属性的表达式应用于该属性的包装器,下面是一个示例;一个数字列表和一个列表包装数字,表达式是[数字是偶数]
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; namespace ExpressionTest { class Program { static void Main(string[] args) { /* Expression */ Expression<Func<int,bool>> expression = item => item % 2 == 0; /* List */ IList<int> items = new List<int>(); for (int i = 0; i < 10; i++) { items.Add(i); } IEnumerable<int> evenNumbers = items.Where(expression.Compile()); foreach (int number in evenNumbers) { Console.WriteLine(number.ToString()); } /* Wrappers List */ // How to apply expression to the porpery 'Number'? IList<Wrapper> wrappers = new List<Wrapper>(); for (int i = 0; i < 10; i++) { wrappers.Add(new Wrapper { Number = i }); } IEnumerable<int> evenWrappedNumbers = ????; foreach (Wrapper wrappedNumber in evenWrappedNumbers) { Console.WriteLine(wrappedNumber.ToString()); } } } public class Wrapper { public int Number; } } 解决方法
这应该做的伎俩:
Func<int,bool> predicate = expression.Compile(); IEnumerable<Wrapper> evenWrappedNumbers = wrappers.Where(w => predicate(w.Number)); 或者如果你想要一个IEnumerable< int> Func<int,bool> predicate = expression.Compile(); IEnumerable<int> evenWrappedNumbers = wrappers.Where(w => predicate(w.Number)).Select(w => w.Number); 编辑:自从了解NHibernate正在使用中,这是另一种可能的解决方案.请记住,我不使用NHibernate并且对表达式树的经验有限.但无论如何,这应该允许NHibernate将表达式树解析为SQL. 首先在静态类中定义一个扩展方法,如下所示: public static IQueryable<T> Where<T,TProperty>(this IQueryable<T> source,Expression<Func<T,TProperty>> propertySelector,Expression<Func<TProperty,bool>> predicate) { MemberExpression member = propertySelector.Body as MemberExpression; if (member == null) throw new ArgumentException("Must be a property selector","propertySelector"); string propertyName = member.Member.Name; // The input type ParameterExpression propertyParameter = Expression.Parameter(typeof(T)); // The property on that type MemberExpression itemProperty = Expression.Property(propertyParameter,propertyName); // Invoke the specified predicate with the property from the input type InvocationExpression invokeExpression = Expression.Invoke(predicate,itemProperty); // The lambda expression for use with Linq Expression<Func<T,bool>> finalExpression = Expression.Lambda<Func<T,bool>>(invokeExpression,propertyParameter); return source.Where(finalExpression); } 然后可以像这样使用这种扩展方法: IEnumerable<Wrapper> evenWrappedNumbers = wrappers.Where(w => w.Number,expression); 正如我所说,我没有NHibernate的经验,但希望它能够解析这个表达式树并将其转换为SQL. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |