6

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

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);
}

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

4

3 回答 3

6

正如评论中所说,您的 LINQ 查询适用于 NH 3.3。

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

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

您还可以date通过 SqlFunction 使用 Criteria 中的函数。这更令人费解,但允许构建更多动态查询:

return session.CreateCriteria<Foo>()
              .Add(Restrictions.Eq(
                       Projections.SqlFunction("date",
                                               NHibernateUtil.Date,
                                               Projections.Property("MyDate")),
                       day.Date))
                .List<MyClass>(); //executes
于 2012-06-07T12:57:23.403 回答
2
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 );
}
于 2012-06-06T18:44:24.593 回答
2

这取决于 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));
于 2012-06-06T18:52:03.277 回答