Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.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#_Linq_Lambda_Entity Framework 6 - Fatal编程技术网

C# 动态生成的lambda给出与常规lambda不同的结果

C# 动态生成的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

与代码中的常规lambda表达式相比,我遇到了一个动态生成的问题。下面是我用来生成动态lambda的代码

C语言的动态Lambda

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)