Pas*_*mey 8 .net c# linq lambda expression
我正在尝试针对Entity框架(或其他Linq提供程序)创建动态查询.
让我用一些示例代码解释我的问题.
如果我硬编码表达式:
var id = 12345;
Expression<Func<ItemSearch, bool>> myLambda = (s) => s.Id == id;
var finalQuery = context.ItemSearch.Where(myLambda);
this.Log((finalQuery as ObjectQuery).ToTraceString());
Run Code Online (Sandbox Code Playgroud)
生成的SQL如下所示:
SELECT ...
FROM ViewItemSearch "Extent1"
WHERE "Extent1".ID = :p__linq__0
Run Code Online (Sandbox Code Playgroud)
用一个很好的:p__linq__0dbParameter.
如果我创建一个表达式:
var id = 12345;
ParameterExpression param = Expression.Parameter(typeof(ItemSearch), "s");
Expression prop = Expression.Property(param, "Id");
Expression val = Expression.Constant(id);
Expression searchExpr = Expression.Equal(prop, val);
Expression<Func<ItemSearch, bool>> myLambda =
Expression.Lambda<Func<ItemSearch, bool>>(searchExpr , param);
var finalQuery = context.ItemSearch.Where(myLambda);
this.Log((finalQuery as ObjectQuery).ToTraceString());
Run Code Online (Sandbox Code Playgroud)
生成的SQL如下所示:
SELECT ...
FROM ViewItemSearch "Extent1"
WHERE "Extent1".ID = 12345
Run Code Online (Sandbox Code Playgroud)
不再有:p__linq__0dbParameter,因此Db引擎无法缓存查询计划.
我明白这是因为我使用
Expression val = Expression.Constant(id);
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何绑定变量而不是值.
你需要在编译时创建一个lambda来关闭id变量,然后你可以在更复杂的lambda的组合中获取一个用法的主体:
var id = 12345;
ParameterExpression param = Expression.Parameter(typeof(ItemSearch), "s");
Expression prop = Expression.Property(param, "Id");
Expression<Func<int>> idLambda = () => id;
Expression searchExpr = Expression.Equal(prop, idLambda.Body);
Expression<Func<ItemSearch, bool>> myLambda =
Expression.Lambda<Func<ItemSearch, bool>>(searchExpr, param);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5555 次 |
| 最近记录: |