我有一个表单来搜索条件,我使用 PredicateBuilder 将所有条件组合到 WHere 表达式中 - 并且 EF 生成 sql 以在数据库端进行评估。
为了允许用户在相等、开头、结尾和包含之间进行选择,我使用星号通配符。
这是我的代码:
var predicate = LinqKit.PredicateBuilder.New<PersonEntity>(true);
{
var arg = parameters.Name;
arg = arg.Trim();
var start = arg[0] == '*';
var end = arg[arg.Length - 1] == '*';
arg = arg.Trim('*');
if (start && end)
predicate.And(x => x.Name.Contains(arg));
else if (start)
predicate.And(x => x.Name.StartsWith(arg));
else if (end)
predicate.And(x => x.Name.EndsWith(arg));
else
predicate.And(x => x.Name == arg);
}
{
var arg = parameters.Address;
arg = arg.Trim();
var start = arg[0] == '*';
var end = arg[arg.Length - 1] == '*';
arg = arg.Trim('*');
if (start && end)
predicate.And(x => x.Address.Contains(arg));
else if (start)
predicate.And(x => x.Address.StartsWith(arg));
else if (end)
predicate.And(x => x.Address.EndsWith(arg));
else
predicate.And(x => x.Address == arg);
}
结束等...
我想写一个通用的辅助函数,以方便使用:
predicate.And(Helper.AddStringCompareCriteria(x => x.Name, parameters.Name);
predicate.And(Helper.AddStringCompareCriteria(x => x.Address, parameters.Address);
我现在的尝试:
public static class Helper
{
static Type strType = typeof(string);
static MethodInfo strStart = typeof(string).GetMethod("StartsWith");
static MethodInfo strEnd = typeof(string).GetMethod("EndsWith");
static MethodInfo strContains = typeof(string).GetMethod("Contains");
static MethodInfo strEquals = typeof(string).GetMethod("Equals");
static MethodInfo RightMethod(bool start, bool end)
{
if (start && end)
return strContains;
if (start)
return strStart;
if (end)
return strEnd;
else
return strEquals;
}
public static Expression<Func<T, bool>> AddStringCompareCriteria<T, TResult>(Expression<Func<T, TResult>> member, string toComprae)
{
var arg = toComprae;
arg = arg.Trim();
var start = arg[0] == '*';
var end = arg[arg.Length - 1] == '*';
arg = arg.Trim('*');
MethodInfo method = RightMethod(start, end);
ParameterExpression entityParam = Expression.Parameter(typeof(T), "entity");
return Expression.Lambda<Func<T, bool>>(
Expression.Call(/* get-member-here?*/ , method, new[] { Expression.Constant(arg) }),
entityParam);
}
}
我现在不知道如何访问选定的成员(通过函数表达式),而且我不确定我的方向是否正确,我很乐意提供帮助!