与代码中的常规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中使用全文搜索吗?
答案 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)