gpt4 book ai didi

c# - 将 lambda 表达式转换为用于缓存的唯一键

转载 作者:可可西里 更新时间:2023-11-01 09:10:19 26 4
gpt4 key购买 nike

我查看了与此类似的其他问题,但找不到任何可行的答案。

我一直在使用以下代码生成唯一键,以便将我的 linq 查询结果存储到缓存中。

    string key = ((LambdaExpression)expression).Body.ToString();

foreach (ParameterExpression param in expression.Parameters)
{
string name = param.Name;
string typeName = param.Type.Name;

key = key.Replace(name + ".", typeName + ".");
}

return key;

它似乎适用于包含整数或 bool 值的简单查询,但当我的查询包含嵌套常量表达式时,例如

// Get all the crops on a farm where the slug matches the given slug.
(x => x.Crops.Any(y => slug == y.Slug) && x.Deleted == false)

因此返回的 key 是:

(True AndAlso (Farm.Crops.Any(y => (value(OzFarmGuide.Controllers.FarmController+<>c__DisplayClassd).slug == y.Slug)) AndAlso (Farm.Deleted == False)))

如您所见,我传递的任何裁剪名称都会给出相同的关键结果。有没有一种方法可以提取给定参数的值,以便我可以区分我的查询?

同时将 y 转换为正确的类型名称会很好......

最佳答案

正如 Polity 和 Marc 在他们的评论中所说,您需要的是 LINQ 表达式的部分计算器。您可以阅读如何使用 ExpressionVisitor 来做到这一点在 Matt Warren's LINQ: Building an IQueryable Provider - Part III .文章Caching the results of LINQ queries by Pete Montgomery (由 Polity 链接)描述了一些关于这种缓存的更多细节,例如如何在查询中表示集合。

另外,我不确定我会依赖 ToString()像这样。我认为这主要是为了调试目的,将来可能会改变。另一种方法是创建自己的 IEqualityComparer<Expression>它可以为任何表达式创建哈希码,并可以比较两个表达式是否相等。我可能会使用 ExpressionVisitor 来做到这一点也一样,但这样做会很乏味。

关于c# - 将 lambda 表达式转换为用于缓存的唯一键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9746896/

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