我想从特定日期获取所有记录,无论与这些记录相关联的时间。到目前为止,我有这样的方法:
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的第一种方法?
答案 0 :(得分:6)
如评论中所述,您的LINQ查询在NH 3.3中运行良好。
在早期版本中,您可以使用HQL:
return session.CreateQuery("from MyClass where date(MyDate) = :day")
.SetParameter("day", day.Date)
.List<MyClass>(); //executes
您还可以通过SqlFunction使用Criteria中的date
函数。这更复杂,但允许构建更多动态查询:
return session.CreateCriteria<Foo>()
.Add(Restrictions.Eq(
Projections.SqlFunction("date",
NHibernateUtil.Date,
Projections.Property("MyDate")),
day.Date))
.List<MyClass>(); //executes
答案 1 :(得分: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 );
}
答案 2 :(得分: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));