Я пытаюсь создать объект критериев, использующий NHibernate, который сравнит date1 с date2 минус значение. В SQL-сервере я сделал бы это:
выберите * из таблицы где date1 <DateAdd (День, 2, date2)
Кто-либо может сказать, как я сделал бы это в NHibernate?
Удачи
Править
Я должен был указать это ранее, я хотел бы узнать, как действительно делают это использование критериев API.
Также date1 и date2 являются столбцами на таблице, таким образом, я не знаю их значение прежде, чем выполнить запрос
Ну, точно так же: -)
HQL:
session.CreateQuery("from Entity where Date1 < DateAdd(Day, 2, Date2)")
SQL:
session.CreateSQLQuery(@"select * from table
where date1 < DateAdd(Day, 2, date2)")
.AddEntity(typeof(Entity))
Критерии:
session.CreateCriteria<Entity>()
.Add(Restrictions.LtProperty(
Projections.Property("Date1"),
Projections.SqlFunction(
new SQLFunctionTemplate(NHibernateUtil.Date,
"DateAdd(Day, 2, ?1)"),
NHibernateUtil.Date,
Projections.Property("Date2"))))
Во всех случаях .List ()
выполнит запрос и вернет список объектов указанного типа.
Учитывая минимальный объем информации, вот моя оценка:
TimeSpan timespanToSubtract;
var dateToCompare = new DateTime().Subtract(timespanToSubtract);
// using NHibernate.Linq:
var result = Session.Linq<Table>()
.Where(t => t.Date1 < dateToCompare)
.ToList();
// using HQL
var hql = "from Table t where t.Date1 < :dateToCompare");
var result = Session.CreateQuery(hql)
.SetParameter("dateToCompare", dateToCompare)
.List<Table>();
Для этого вам, вероятно, потребуется создать собственный диалект , который регистрирует функцию dateadd, а затем использовать проекцию SqlFunction для выполнить критический запрос.