【问题标题】:How do I create a lambda expression using return value from another lambda expression? [duplicate]如何使用来自另一个 lambda 表达式的返回值创建 lambda 表达式? [复制]
【发布时间】:2018-06-18 18:10:30
【问题描述】:

问题和答案都与“将Linq表达式“obj => obj.Prop”转换为“parent => parent.obj.Prop””的问题相同。唯一重复我最近在这里发现有控制问题的重复模组的数量。

我正在尝试为实体框架创建一个扩展方法,如果给定值不是空值或空格,它将在字段上添加“包含”调用。纯粹出于懒惰,不想让所有 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,则返回可能很简单:

ent => exp(ent).Contains(s)

这就是我想要做的。

【问题讨论】:

    标签: c# entity-framework lambda expression-trees linq-expressions


    【解决方案1】:

    您想从 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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      相关资源
      最近更新 更多