gpt4 book ai didi

c# - 如何在 NHibernate.Linq 中缓存 .Count() 查询?

转载 作者:行者123 更新时间:2023-11-30 12:29:44 25 4
gpt4 key购买 nike

如何缓存此类查询的结果:

Session.Query<Entity>().Count(e=> e.Property == someConstant)

我不能将 Cacheable() 放在它之后,如果我将它放在 Count() 之前,它会获取整个结果集,不是吗?

最佳答案

在计数前添加Cacheable将导致聚合计数结果被缓存。这可以从我下面的示例生成的 SQL 中看出。

域和映射代码

public class Entity
{
public virtual long id { get; set; }
public virtual string name { get; set; }
}

public class EntityMap : ClassMap<Entity>
{
public EntityMap()
{
Id(x => x.id).GeneratedBy.Identity();
Map(x => x.name);
Cache.ReadOnly();
}
}

测试代码本身。

using (var session = NHibernateHelper.OpenSession())
using (var tx = session.BeginTransaction())
{
session.Save(new Entity() { name = "Smith" });
session.Save(new Entity() { name = "Smithers" });
session.Save(new Entity() { name = "Smithery" });
session.Save(new Entity() { name = "Smith" });
tx.Commit();
}

String name_constant = "Smith";
using (var session = NHibernateHelper.OpenSession())
using (var tx = session.BeginTransaction())
{
var result = session.Query<Entity>().Cacheable().Count(e => e.name == name_constant);
}

using (var session = NHibernateHelper.OpenSession())
using (var tx = session.BeginTransaction())
{
var result = session.Query<Entity>().Cacheable().Count(e => e.name == name_constant);
}

从上面的代码生成的 SQL 可以在下面看到。如您所见,有四个 INSERT 语句,每个 session.Save 一个。尽管有两个查询,但只有一个 SELECT,每个查询都在一个单独的 session 下执行。这是因为计数结果已被 NHibernate 缓存

NHibernate: INSERT INTO [Entity] (name) VALUES (@p0); select SCOPE_IDENTITY();
@p0 = 'Smith' [Type: String (4000)]
NHibernate: INSERT INTO [Entity] (name) VALUES (@p0); select SCOPE_IDENTITY();
@p0 = 'Smithers' [Type: String (4000)]
NHibernate: INSERT INTO [Entity] (name) VALUES (@p0); select SCOPE_IDENTITY();
@p0 = 'Smithery' [Type: String (4000)]
NHibernate: INSERT INTO [Entity] (name) VALUES (@p0); select SCOPE_IDENTITY();
@p0 = 'Smith' [Type: String (4000)]
NHibernate: select cast(count(*) as INT) as col_0_0_ from [Entity] entity0_
where entity0_.name=@p0;
@p0 = 'Smith' [Type: String (4000)]

可能导致 NHibernate 忽略 Cacheable 并返回到 DB 的场景是:

  1. session 工厂配置中未启用二级缓存。
  2. 实体尚未标记为可缓存。

据我所知,唯一会导致 NHibernate 执行两次 SELECT 查询的其他情况是当实体已从缓存中逐出时,要么显式使用 sessionFactory.Evict或者缓存的实体在两次调用之间过期。

关于c# - 如何在 NHibernate.Linq 中缓存 .Count() 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17972820/

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