gpt4 book ai didi

Linq to NHibernate 和 Dynamic LINQ - 查询缓存不工作

转载 作者:行者123 更新时间:2023-12-04 12:28:27 24 4
gpt4 key购买 nike

我对 NHibernate 的二级缓存有疑问。当我使用查询时:

        var items1 = Session.Query<Row>()
.Cacheable();
.Fetch(x => x.Field)
.OrderBy(x => x.Field.Value)
.ToList();

一切正常 - 查询已缓存。但是当我想使用 Dynamic Linq ( a link ) 时:

       var items2 = Session.Query<Row>()
.Cacheable();
.Fetch(x => x.Field)
.OrderBy("Field.Value")
.ToList();

查询未缓存。有趣的是,当我删除代码行时:

            .Fetch(x => x.Field)

缓存再次工作。所以问题在于同时使用 Fetch 和动态 linq OrderBy 方法。

编辑:

当我尝试调试 NH 代码(QueryKey 类)时,调试器告诉我这两个查询没有相同的 ResultTransformer(并且更深层次:一个 listTransformation 私有(private)实例)。

有什么想法吗?

克里斯

最佳答案

好的,我知道是什么原因了。

Dynamic Linq 不在 Linq 表达式中使用参数名称。例如。如果我想使用 lambda 语句进行排序,我会写:

query.OrderBy(item => item.Name)

上面我们看到一个item lambda 参数名。

当我使用动态 linq 时:

query.OrderBy("Name")

在查询结果中,OrderBy 方法中的 lambda 参数没有名称(如上面写的 item)。我们可以这样说明结果:

query.OrderBy( => .Name)

现在,当 NHibernate 正在解码那个 Queryable 表达式并发现那里有一个没有名称的表达式参数时,NH 会使用 GUID 类给它一个随机名称。因此,使用动态 linq 的每个排序都会产生一个具有不稳定 lambda 参数的可查询表达式。这就是为什么 NHibernate 认为:query.OrderBy("Name")query.OrderBy("Name") 不一样——它们有另一个 lamda 参数每次都从头开始生成。

解决方案

如果要修复它,则必须修改 Dynamic Linq 库。

  1. 在方法 ExpressionParser.ProcessParameters 中更改行:

    if (parameters.Length == 1 && String.IsNullOrEmpty(parameters[0].Name))

    到:

    if (parameters.Length == 1 && (parameters[0].Name == "it" || String.IsNullOrEmpty(parameters[0].Name)))
  2. 在方法 DynamicQueryable.OrderBy 中更改行:

    Expression.Parameter(source.ElementType, "")

    到:

    Expression.Parameter(source.ElementType, "it")

现在,query.OrderBy("Name") 将生成 query.OrderBy(it => it.Name)

干杯!

关于Linq to NHibernate 和 Dynamic LINQ - 查询缓存不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11795625/

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