按日期获取记录,仅使用nhibernate进行日期部分比较

本文关键字:nhibernate 日期部 比较 获取 日期 记录 | 更新日期: 2023-09-27 18:36:22

我想获取特定日期的所有记录,无论这些记录与什么时间相关联。到目前为止,我有这样的方法:

public IQueryable<Record> QueryByDay(DateTime day)
{
    DateTime from = day.Date;
    DateTime to = day.Date.AddDays(1);
    return repository.Table
        .Where(t => t.MyDate >= from && t.MyDate < to);
    }

但是在 linq-to-object 中我们可以这样做(假设 Table 现在是某个集合):

public IEnumerable<Record> QueryByDay(DateTime day)
{
    return repository.Table
        .Where(t => t.MyDate.Date == day.Date);
}

这显然更具可读性,感觉更干净。我想知道是否有更好的方法来编写使用数据库存储和 nhibernate 的第一种方法?

按日期获取记录,仅使用nhibernate进行日期部分比较

如注释中所述,您的 LINQ 查询适用于 NH 3.3。

在早期版本中,您可以使用 HQL:

return session.CreateQuery("from MyClass where date(MyDate) = :day")
              .SetParameter("day", day.Date)
              .List<MyClass>(); //executes

您还可以通过 SqlFunction 使用条件中的date函数。这更复杂,但允许构建更多动态查询:

return session.CreateCriteria<Foo>()
              .Add(Restrictions.Eq(
                       Projections.SqlFunction("date",
                                               NHibernateUtil.Date,
                                               Projections.Property("MyDate")),
                       day.Date))
                .List<MyClass>(); //executes
public IEnumerable<Record> QueryByDay(DateTime day)
{
    return repository.Table
        .Where(t => t.MyDate.Day == day.Day && t.MyDate.Month == day.Month && t.MyDate.Year == day.Year );
}

这取决于 LINQ 提供程序。我不确定 NHibernate LINQ 提供程序是否支持 item.SomeDateProperty.Date == x 语法,我怀疑它是否支持。但是,您可以创建自己的扩展方法,如下所示:

public static IQueryable<T> FilterByDate(this IQueryable<T> This, Expression<Func<T, DateTime>> getProperty, DateTime date)
{
  DateTime from = day.Date;
  DateTime to = day.Date.AddDays(1);
  return This.Where(x=> 
    Expression.And(
      Expression.GreaterThan(getProperty, Expression.Variable(from)),
      Expression.LessThan(getProperty, Expression.Variable(to)));
}

这不会像现在这样构建 - 我只是想让你知道该怎么做。

然后,您可以像这样使用它:

var result = repository.Table.FilterByDate(x=>x.MyDate, new DateTime(2012, 6,6));