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

时间:2014-10-09 17:46:50

标签: c# linq lambda entity-framework-6

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

动态Lambda for C

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")}

但是当我在这样的代码中执行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,以便我们可以在SQL Server中使用全文搜索。

我的问题是,有没有办法动态生成lambda以获得与常规lambda完全相同的输出?或者有更好的方法在Entity Framework 6中使用全文搜索吗?

1 个答案:

答案 0 :(得分:0)

由于你将值声明为常量(Expression.Constant),我猜想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)