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

Zac*_*ott 8 c# entity-framework-4 c#-4.0

我想接受一个字符串数组,其中来自客户端的条件就像field == value.创建一个可以接受构造函数中的字符串并输出lambda表达式来表示Where子句的规范对象真的很不错.例如,我可以执行以下操作:

var myCondition = new Specification<Product>( myStringArrayOfConditions); 
var myProducts = DB.Products.Where( myCondition);
Run Code Online (Sandbox Code Playgroud)

你怎么会"name == Jujyfruits"变成
DB.Products.Where(p => p.name == "JujyFruits")

Hei*_*nzi 14

您可以使用

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

请注意,以下代码示例仅适用于Equals (==)操作.但是,也可以很容易地推广到其他操作(在空格上拆分,解析运算符并选择适当的表达式而不是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
Run Code Online (Sandbox Code Playgroud)

关于构造函数:由于Func<T, TResult>是密封的,你无法从它派生.但是,您可以创建一个隐式转换操作符是翻译Specification<T>Func<T, bool>.