【发布时间】: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