如何在运行时从字符串表达式获取Predicate <t>

时间:2018-02-19 14:28:21

标签: c# linq predicate dynamic-linq flee

在使用EntityFramework的Winform应用程序中,我使用BaseForm的BindingSource实现通用搜索/过滤器UI组件,并根据BindingSource(上下文实体)的DataSource的用户输入和属性动态构建搜索/过滤器字符串表达式。

EntityFramework中的BindingSource不支持查找和过滤, 因为ObjectContext或DataContext的查询结果是IEnumerable类型,它没有实现IBindingList接口ref

作为一种解决方法,我将BindingSource投射到List<T>

要实现一个,我使用List<T>.Find(predicate),谓词是一个lambda Expression。

要将谓词传递给List<T>.Find(predicate),我需要将动态生成的字符串表达式转换为谓词。

字符串表达式示例:

  

&#34; CategoryId = 5和Price&lt; 10&#34;

To Something使用类似的方法:

Predicate<T>  GetPredicate <T>(string expression)
{   
    //how  to convert the string expressions to    Predicate<T> 
}

然后将谓词传递给方法List<T>. Find(predicat)

我可以使用.Where (dynamicStringExpression),但对于我的组件,我需要GetPredicate(dynamicStringExpression)

如何从字符串表达式中获取Predicate<T>

2 个答案:

答案 0 :(得分:1)

正如评论中所建议的那样,使用Dynamic Linq会更好。因为find()相当于Where()。FirstOrdefault():

appcfg.py

答案 1 :(得分:1)

我使用了基于System.Linq.Dynamic

a previous work by MicroSoft
  

Install-Package System.Linq.Dynamic

我实现了以下静态/扩展方法:

using System;
using System.Collections.Generic;
using DynamicExpression=System.Linq.Dynamic.DynamicExpression; //nuget package
using System.Linq.Expressions;

public static class MyDynamics
{           
    public static Predicate<T> GetPredicate<T>(string stringExpression)
    {        
        var exp = DynamicExpression.ParseLambda<T, bool>(stringExpression).Compile();               
        var predicate = new Predicate<T>(exp);
        return predicate;
    }   
}

使用方法:

Console.WriteLine("------- Find items using string expression ------");     
//use string expression
var predicate = MyDynamics.GetPredicate<Part>("PartId==1444");
//pass  the predicate to List.Find
var part= parts.Find(predicate);
Console.WriteLine("Part: Find: PartId= {0} , PartName={1}",part.PartId, part.PartName);

Fiddle

中的生活演示