如何使用来自另一个 lambda 表达式的 return 值创建 lambda 表达式?
How do I create a lambda expression using return value from another lambda expression?
问题和答案都与问题 "Convert Linq expression “obj => obj.Prop” into “parent => parent.obj.Prop”" 相同。 我最近在这里发现的唯一重复项是重复模组的数量控制问题。
我正在尝试为 Entity Framework 创建一个扩展方法,如果给定值不是 null 或空白,它将在字段上添加 "Contains" 调用。这纯粹是出于懒惰,不想让所有 if 语句检查 null 或空格。
我希望能够像这样使用它:
var qry = MyDb.Redacteds.OrderBy(a=>a.RedactedDate);
qry = qry.WhereContains(a => a.RedactedName, txtRedactedName.Text);
我想到了这个,但显然 Invoke 会导致 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,return 可以简单地是:
ent => exp(ent).Contains(s)
这就是我想要做的。
您想从 lambda 中获取参数并将正文用作表达式。您根本没有将它用作 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;
}
问题和答案都与问题 "Convert Linq expression “obj => obj.Prop” into “parent => parent.obj.Prop”" 相同。 我最近在这里发现的唯一重复项是重复模组的数量控制问题。
我正在尝试为 Entity Framework 创建一个扩展方法,如果给定值不是 null 或空白,它将在字段上添加 "Contains" 调用。这纯粹是出于懒惰,不想让所有 if 语句检查 null 或空格。
我希望能够像这样使用它:
var qry = MyDb.Redacteds.OrderBy(a=>a.RedactedDate);
qry = qry.WhereContains(a => a.RedactedName, txtRedactedName.Text);
我想到了这个,但显然 Invoke 会导致 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,return 可以简单地是:
ent => exp(ent).Contains(s)
这就是我想要做的。
您想从 lambda 中获取参数并将正文用作表达式。您根本没有将它用作 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;
}