实体框架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") ?

实体框架4:将字符串条件转换为lambda表达式

可以使用

  • 从字符串name
  • 中获取属性Product.name的反射
  • LINQ Expression类手动创建lambda表达式。

注意,下面的代码示例只适用于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);