【问题标题】:Row Count Nhibernate行计数休眠
【发布时间】:2016-10-30 03:30:44
【问题描述】:

我正在构建一个网络应用程序,我需要根据一些限制获取数据库中一个表上的行数,所以我的代码看起来像这样:

db.Query<DutyDoctor>()
  .Where(x => x.Duty.Time.ToUpper() == periodo.ToUpper())
  .Where(x => x.Doctor.Id == doctorId)
  .Count(x => x.EnterDatetime.Year == ano || x.ExitDatetime.Year == ano);

我读过这样的查询在性能上会很差,因为它会获取所有对象,创建一个对象列表,而不仅仅是给我列表的长度,然后,因为我只想要遵守这些限制的行数,我见过一些这样的例子:

 db.QueryOver<DutyDoctor>()
      .Where(x => x.Duty.Time.ToUpper() == periodo.ToUpper())
      .Where(x => x.Doctor.Id == doctorId)
      .Where(x => x.EnterDatetime.Year == ano || x.ExitDatetime.Year == ano)
      .RowCount();

它不起作用,我有一个例外,所以我想问一下我如何让第二个例子工作,我怎样才能提高第一个例子的性能,让它只得到行数数据库,使用db.QueryOver()db.Query() insted。




*db 的类型为 NHibernate.ISession

【问题讨论】:

  • “它不起作用,我有一个例外”。你认为也许异常的文本很重要吗?
  • 例外是:从范围“”引用的“MedSolutions.DAO.Models.DoctorDuty”类型的变量“x”,但未定义
  • 您所说的 NH 将加载所有对象,我认为这仅取决于您如何编写查询。请参阅 linq 的延迟执行。我觉得你写的方式没问题,你可能想检查一下使用 profiler 执行的 sql 查询。
  • 我已经检查了一个配置文件,第一个示例实际上是在做正确的事情,它是一个由 NHibernate 执行的“选择计数(*)”。还是谢谢你。
  • 看看预测。项目 EnterDatetime.Year 和 ExitDatetime.Year,然后进行计数。

标签: c# sql asp.net database nhibernate


【解决方案1】:

这是一个使用投影来获取行数的示例:

public int GetNumberOfRecordsFromTable()
{
  return session.QueryOver<YourTable>()
            .Select(Projections.RowCount())
            .FutureValue<int>()
            .Value;
}

【讨论】:

    猜你喜欢
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2019-04-21
    相关资源
    最近更新 更多