C# 如何使用另一个lambda表达式的返回值创建lambda表达式?
问题和答案都与“将Linq表达式“obj=>obj.Prop”转换为“parent=>parent.obj.Prop”的问题不同。我最近在这里发现的唯一重复的问题是存在控制问题的重复MOD的数量 我正在尝试为Entity Framework创建一个扩展方法,如果给定值不是null或空白,它将在字段上添加一个“Contains”调用。这纯粹是出于懒惰,不希望所有if语句都检查null或空格 我希望能够像这样使用它:C# 如何使用另一个lambda表达式的返回值创建lambda表达式?,c#,entity-framework,lambda,expression-trees,linq-expressions,C#,Entity Framework,Lambda,Expression Trees,Linq Expressions,问题和答案都与“将Linq表达式“obj=>obj.Prop”转换为“parent=>parent.obj.Prop”的问题不同。我最近在这里发现的唯一重复的问题是存在控制问题的重复MOD的数量 我正在尝试为Entity Framework创建一个扩展方法,如果给定值不是null或空白,它将在字段上添加一个“Contains”调用。这纯粹是出于懒惰,不希望所有if语句都检查null或空格 我希望能够像这样使用它: var qry = MyDb.Redacteds.OrderBy(a=>a.
var qry = MyDb.Redacteds.OrderBy(a=>a.RedactedDate);
qry = qry.WhereContains(a => a.RedactedName, txtRedactedName.Text);
我已经想到了这一点,但很明显调用会导致EF出现问题。在构建表达式时使用lambda的结果有什么诀窍
// create
// ent => exp(ent).Contains(s)
public static IQueryable<T> WhereContains<T>(this IQueryable<T> qry, Expression<Func<T, string>> exp, string s)
{
if (!string.IsNullOrWhiteSpace(s))
{
s = s.Trim();
var param = Expression.Parameter(typeof(T), "ent");;
var call = Expression.Invoke(exp, param); // <-= HERE
var body = Expression.Call(call, typeof(string).GetMethod("Contains", new[] { typeof(string) }), Expression.Constant(s));
var lambda = Expression.Lambda<Func<T, bool>>(body, param);
qry = qry.Where(lambda);
}
return qry;
}
这就是我要做的。您希望从lambda中获取参数,并使用body作为表达式。您根本没有将其用作lambda,而是从lambda中选取表达式树和参数
// create
// ent => exp(ent).Contains(s)
public static IQueryable<T> WhereContains<T>(this IQueryable<T> qry, Expression<Func<T, string>> exp, string s)
{
if (!string.IsNullOrWhiteSpace(s))
{
s = s.Trim();
//HERE GRAB THE PARAMETER
var param = exp.Parameters[0];
//HERE JUST USE EXP.BODY
var body = Expression.Call(exp.Body, typeof(string).GetMethod("Contains", new[] { typeof(string) }), Expression.Constant(s));
var lambda = Expression.Lambda<Func<T, bool>>(body, param);
qry = qry.Where(lambda);
}
return qry;
}
//创建
//ent=>exp(ent).Contains(s)
公共静态IQueryable WhereContains(此IQueryable qry、表达式exp、字符串s)
{
如果(!string.IsNullOrWhiteSpace))
{
s=s.修剪();
//这里获取参数
var param=exp.Parameters[0];
//这里只使用EXP.BODY
var body=Expression.Call(exp.body,typeof(string).GetMethod(“Contains”,new[]{typeof(string)}),Expression.Constant(s));
var lambda=表达式.lambda(body,param);
qry=qry.Where(λ);
}
返回qry;
}
// create
// ent => exp(ent).Contains(s)
public static IQueryable<T> WhereContains<T>(this IQueryable<T> qry, Expression<Func<T, string>> exp, string s)
{
if (!string.IsNullOrWhiteSpace(s))
{
s = s.Trim();
//HERE GRAB THE PARAMETER
var param = exp.Parameters[0];
//HERE JUST USE EXP.BODY
var body = Expression.Call(exp.Body, typeof(string).GetMethod("Contains", new[] { typeof(string) }), Expression.Constant(s));
var lambda = Expression.Lambda<Func<T, bool>>(body, param);
qry = qry.Where(lambda);
}
return qry;
}