C# 基于列差异过滤的NHibernate查询
以下是约会模型的快照:C# 基于列差异过滤的NHibernate查询,c#,asp.net,nhibernate,C#,Asp.net,Nhibernate,以下是约会模型的快照: public class Appointment { public virtual DateTime? InTime {get; set;} public virtual DateTime? OutTime {get; set;} } 我想要所有持续时间少于2分钟的约会。比如: var twoMinutes = new TimeSpan(0, 0, 2, 0); var query = Repository.QueryOver&l
public class Appointment
{
public virtual DateTime? InTime {get; set;}
public virtual DateTime? OutTime {get; set;}
}
我想要所有持续时间少于2分钟的约会。比如:
var twoMinutes = new TimeSpan(0, 0, 2, 0);
var query =
Repository.QueryOver<DomainModel.Models.Appointment>()
.Where(a => a.OutTime.Value - a.InTime.Value < twoMinutes);
return query.List();
例外情况:
从作用域引用了类型为“DomainModel.Models.Appointment”的变量“a”,但未定义该变量
当我尝试使用QueryOver查询时,我得到了一个错误。我如何在nHibernate中使用ICriteria或任何其他方法来实现这一点?正如我在评论中提到的,这里的解决方案是将该比较移到DB中。据我所知,这应该通过投影来实现:
// two minutes
var twoMinutes = 2d;
// the query
var query = Repository.QueryOver<DomainModel.Models.Appointment>();
// the projection using DATEDIFF
var projection = Projections
.SqlProjection("DATEDIFF(mi, {alias}.InTime ,{alias}.outTime) as difference"
, new[] {"difference"}
, new[] {NHibernateUtil.Double});
检查
DATEDIFFdatepart、startdate、enddate
这意味着要获得正数,第一个arg必须更老
注意:有些东西被QueryOver引擎正确地转换为适当的SQL,但这一个不是…有server C生命时刻,也有DB生命时刻。差分的计算是必须在DB上进行的。所以创建一个投影,计算DB上的结果。。。与从服务器传递的param进行比较所以你说的是-这必须在两个查询中完成-一个是获取超时和及时之间的差异,另一个是传递差异并与两分钟进行比较?@mridula这听起来一点都不正确。如果你回答了上面Liath的问题,你会得到更多的帮助。我已经编辑了这个问题,添加了我得到的错误。
query.Where(Restrictions.Ge(projection, twoMinutes));