在使用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>
答案 0 :(得分:1)
正如评论中所建议的那样,使用Dynamic Linq会更好。因为find()相当于Where()。FirstOrdefault():
appcfg.py
答案 1 :(得分:1)
我使用了基于System.Linq.Dynamic
的a previous work by MicroSoftInstall-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);
中的生活演示