C# 动态生成的lambda给出与常规lambda不同的结果
与代码中的常规lambda表达式相比,我遇到了一个动态生成的问题。下面是我用来生成动态lambda的代码 C语言的动态LambdaC# 动态生成的lambda给出与常规lambda不同的结果,c#,linq,lambda,entity-framework-6,C#,Linq,Lambda,Entity Framework 6,与代码中的常规lambda表达式相比,我遇到了一个动态生成的问题。下面是我用来生成动态lambda的代码 C语言的动态Lambda var parameterExp = Expression.Parameter(typeof(T), "x"); var propertyExp = Expression.Property(parameterExp, propertyName); MethodInfo method = typeof(string).GetMethod("Contains", new
var parameterExp = Expression.Parameter(typeof(T), "x");
var propertyExp = Expression.Property(parameterExp, propertyName);
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var someValue = Expression.Constant(propertyValue, typeof(string));
var containsMethodExp = Expression.Call(propertyExp, method, someValue);
return Expression.Lambda<Func<T, bool>>(containsMethodExp, parameterExp);
但是当我在这样的代码中执行lambda时
x => x.Name.Contains("UserName");
我得到这个结果。FormattedText是用于常规lambda的变量
{x => x.Name.Contains(value(Test.BusinessLogicLayer.ClassBLL+<>x__DisplayClass8).formattedText)}
我在Iqueryable对象的where子句上使用lambda。动态lambda在Iqueryable中生成SQL,不带SQL参数。常规lambda使SQL具有参数。我需要它生成参数。我们正在循环遍历参数,将like更改为contains,以便在SQLServer中使用全文搜索
我的问题是,是否有一种方法可以动态生成lambda,使其与常规lambda具有完全相同的输出?或者在Entity Framework 6中使用全文搜索有更好的方法吗?因为您将值声明为常量表达式。常量我想EF只是生成没有参数的SQL,因为它知道常量不能更改 也许您最好生成一个lambda,明确地将参数作为输入
var parameterExp = Expression.Parameter(typeof(T), "x");
var containsParameter = Expression.Parameter(typeof(string), "p");
var propertyExp = Expression.Property(parameterExp, propertyName);
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var containsMethodExp = Expression.Call(propertyExp, method, containsParameter);
这将产生
(x, p) => x.Name.Contains(p)
粘贴的lambda与调试器中显示的lambda不匹配。我怀疑您没有文字用户名参数,而是引用了一个变量或属性。请将lambda完全按照代码中的显示粘贴,请不要模糊不清,不要伪代码。上面T的具体值是多少?cdHowie。我在output的正上方放了一条关于格式化文本的注释。想要显示lambda.500内部服务器错误中的实际值,T表示我们需要为其生成lambda的任何类。是的,我尝试了这个,但它不起作用。当我将返回的lambda发送到IQueryable对象时,它不符合要求。
(x, p) => x.Name.Contains(p)