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クエリはNH3.3で正常に機能します。

以前のリリースでは、HQLを使用できます。

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

dateSqlFunctionを介して、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

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 に答える
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 に答える