6 Stimmen

Abrufen von Datensätzen nach Datum unter Verwendung eines NHibernate-Befehls, um nur den Tagesbestandteil zu vergleichen

Ich möchte alle Datensätze aus einem bestimmten Tag abrufen, unabhängig von der Uhrzeit, die mit diesen Datensätzen verbunden ist. Bisher habe ich eine Methode wie diese:

public IQueryable QueryByDay(DateTime day)
{
    DateTime from = day.Date;
    DateTime to = day.Date.AddDays(1);

    return repository.Table
        .Where(t => t.MyDate >= from && t.MyDate < to);
    }

Aber in Linq-to-Object können wir (unter der Annahme, dass Table jetzt eine Sammlung ist) Folgendes tun:

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

Das ist offensichtlich lesbarer und fühlt sich sauberer an. Ich frage mich, ob es eine bessere Möglichkeit gibt, die erste Methode mit der Speicherung in einer Datenbank und NHibernate zu schreiben?

6voto

Diego Mijelshon Punkte 52110

Wie in den Kommentaren erwähnt, funktioniert Ihre LINQ-Abfrage gut mit NH 3.3.

In früheren Versionen können Sie HQL verwenden:

return session.CreateQuery("from MyClass where date(MyDate) = :day")
              .SetParameter("day", day.Date)
              .List(); //ausführen

Sie können auch die date-Funktion aus Criteria über SqlFunction verwenden. Dies ist komplizierter, ermöglicht aber den Aufbau von dynamischeren Abfragen:

return session.CreateCriteria()
              .Add(Restrictions.Eq(
                       Projections.SqlFunction("date",
                                               NHibernateUtil.Date,
                                               Projections.Property("MyDate")),
                       day.Date))
                .List(); //ausführen

2voto

Ivo Punkte 8053
public IEnumerable QueryByDay(DateTime day)
{
    return repository.Table
        .Where(t => t.MyDate.Day == day.Day && t.MyDate.Month == day.Month && t.MyDate.Year == day.Year );
}

2voto

Mr. TA Punkte 4970

Es hängt vom LINQ-Provider ab. Ich bin mir nicht sicher, ob der NHibernate LINQ-Provider die Syntax item.SomeDateProperty.Date == x unterstützt und ich bezweifle das. Aber, du kannst deine eigene Erweiterungsmethode so erstellen:

public static IQueryable FilterByDate(this IQueryable This, Expression> 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)));

}

Das wird aktuell nicht so kompilieren - ich habe nur versucht, dir eine Idee zu geben, was zu tun ist.

Dann kannst du es folgendermaßen nutzen:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X