我查看了与此类似的其他问题,但找不到任何可行的答案。
我一直在使用以下代码来生成唯一键,用于将 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;
它似乎适用于包含整数或布尔值的简单查询,但是当我的查询包含嵌套常量表达式时,例如
// 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)
返回的密钥是这样的:
(True AndAlso (Farm.Crops.Any(y =>
(值(OzFarmGuide.Controllers.FarmController+c__DisplayClassd).slug
== y.Slug)) AndAlso (Farm.Deleted == False)))
正如您所看到的,我传递的任何作物名称都会给出相同的关键结果。有没有办法可以提取给定参数的值,以便区分我的查询?
还转换了y
说出正确的类型名称会很好......
正如 Polity 和 Marc 在他们的评论中所说,您需要的是 LINQ 表达式的部分求值器。您可以阅读如何使用ExpressionVisitor http://msdn.microsoft.com/en-us/library/system.linq.expressions.expressionvisitor.aspx in 马特·沃伦的LINQ:构建 IQueryable 提供程序 - 第三部分 http://blogs.msdn.com/b/mattwar/archive/2007/08/01/linq-building-an-iqueryable-provider-part-iii.aspx。文章缓存 LINQ 查询的结果作者:皮特·蒙哥马利 http://petemontgomery.wordpress.com/2008/08/07/caching-the-results-of-linq-queries/(由 Poity 链接)描述了有关这种缓存的更多细节,例如如何在查询中表示集合。
另外,我不确定我会依赖ToString()
像这样。我认为它主要用于调试目的,并且将来可能会改变。另一种选择是创建自己的IEqualityComparer<Expression>
它可以为任何表达式创建哈希码,并可以比较两个表达式是否相等。我可能会使用ExpressionVisitor
也是如此,但这样做会非常乏味。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)