【发布时间】:2012-03-04 12:19:48
【问题描述】:
我最近偶然发现了在运行时动态创建 Linq 表达式的问题。我发现的大多数示例都处理相当简单的任务,即仅将给定数据库实体的一个属性与单个参数进行比较。像这样:
Session.Query.Where(m => m.Name.Contains("test"))
这也可以通过像这样更通用的方法来实现:
var item = Expression.Parameter(typeof (MyClass), "item");
var property = Expression.Property(item, "Name");
var containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var searchExpression = Expression.Constant(searchString, typeof(string));
var containsMethodExpression = Expression.Call(property, containsMethod, searchExpression);
var lambda = Expression.Lambda<Func<MyClass, bool>>(containsMethodExpression, item);
query = query.Where(lambda);
但是,有时任务会稍微复杂一些,并且想要达到以下目标:
Session.Query.Where(m => m.SpecialProperty.Any(f => f.Name.Contains("test")));
其中“SpecialProperty”属于List类型,而“Name”属于字符串类型。
是否可以动态构建这样的 Linq 表达式,如何实现?这种方法是否存在任何性能问题?
【问题讨论】:
标签: .net performance linq nhibernate