gpt4 book ai didi

c# - 如何声明 Linq 表达式变量以便将其作为 dbParameter 处理

转载 作者:太空狗 更新时间:2023-10-29 18:31:40 30 4
gpt4 key购买 nike

我正在尝试针对 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());

生成的 SQL 如下所示:

SELECT ...
FROM ViewItemSearch "Extent1"
WHERE "Extent1".ID = :p__linq__0

有一个不错的 :p__linq__0 dbParameter。

如果我创建一个表达式:

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());

生成的 SQL 如下所示:

SELECT ...
FROM ViewItemSearch "Extent1"
WHERE "Extent1".ID = 12345

不再有 :p__linq__0 dbParameter,因此 Db 引擎无法缓存查询计划。

我明白是因为我用

Expression val = Expression.Constant(id);

但我不知道如何绑定(bind)变量而不是值。

最佳答案

您需要在编译时创建一个 lambda 来关闭 id 变量,然后您可以在更复杂的 lambda 的组合中获取 use 的主体:

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);

关于c# - 如何声明 Linq 表达式变量以便将其作为 dbParameter 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24188192/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com