Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用另一个lambda表达式的返回值创建lambda表达式?_C#_Entity Framework_Lambda_Expression Trees_Linq Expressions - Fatal编程技术网

C# 如何使用另一个lambda表达式的返回值创建lambda表达式?

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.

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

我正在尝试为Entity Framework创建一个扩展方法,如果给定值不是null或空白,它将在字段上添加一个“Contains”调用。这纯粹是出于懒惰,不希望所有if语句都检查null或空格

我希望能够像这样使用它:

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;
    }