实体框架4:将字符串条件转换为lambda表达式
本文关键字:转换 lambda 表达式 条件 字符串 框架 实体 | 更新日期: 2023-09-27 17:54:02
我想接受一个字符串数组,其中的条件来自客户端,如field == value
。如果创建一个规范对象,它可以在构造函数中接受字符串,并输出一个lambda表达式来表示Where子句,那就太好了。例如,我可以这样做:
var myCondition = new Specification<Product>( myStringArrayOfConditions);
var myProducts = DB.Products.Where( myCondition);
怎么把"name == Jujyfruits"
变成
DB.Products.Where(p => p.name == "JujyFruits")
?
可以使用
- 从字符串
name
和 中获取属性 - LINQ
Expression
类手动创建lambda表达式。
Product.name
的反射注意,下面的代码示例只适用于Equals (==)
操作。然而,它也很容易推广到其他操作(根据空白分割,解析操作符并选择合适的Expression而不是Expression.Equal
)。
var condition = "name == Jujyfruits";
// Parse the condition
var c = condition.Split(new string[] { "==" }, StringSplitOptions.None);
var propertyName = c[0].Trim();
var value = c[1].Trim();
// Create the lambda
var arg = Expression.Parameter(typeof(Product), "p");
var property = typeof(Product).GetProperty(propertyName);
var comparison = Expression.Equal(
Expression.MakeMemberAccess(arg, property),
Expression.Constant(value));
var lambda = Expression.Lambda<Func<Product, bool>>(comparison, arg).Compile();
// Test
var prod1 = new Product() { name = "Test" };
var prod2 = new Product() { name = "Jujyfruits" };
Console.WriteLine(lambda(prod1)); // outputs False
Console.WriteLine(lambda(prod2)); // outputs True
关于构造函数的事情:因为Func<T, TResult>
是密封的,你不能从它派生。但是,您可以创建一个隐式转换操作符,将Specification<T>
转换为Func<T, bool>
。
我们最近从VS2008示例项目中发现了动态LINQ库。可以完美地将基于字符串的"Where"子句转换为表达式。
需要将搜索词转换为谓词。试试下面的内容:
string searchString = "JujyFruits";
Func<Product, bool> search = new Func<Product,bool>(p => p.name == searchString);
return DB.Products.Where(search);