2014-10-14 2 views
3

Я пытаюсь выразить следующий SQL запрос с NHibernateNHibernate COALESCE вопрос

DECLARE @date DATETIME = NULL; 

SELECT 
    ER.Id 
, ER.DocumentDate 
FROM 
    ExpenseReport ER 
WHERE 
    ER.PeriodFrom >= COALESCE(@date, ER.PeriodFrom) 
OR ER.PeriodTo <= COALESCE(@date, ER.PeriodTo); 

Так, в C# часть у меня есть следующие классы:

  • для лица: ExpenseReport
  • для моего поиска сам по себе отдельный класс

фрагменты кода:

// ----- Entity class. 
public partial class ExpenseReport 
{ 
    public Nullable<System.DateTime> PeriodFrom { get; set; } 
    // many other properties 
} 

// ----- Search parameter class. 
public class SearchParameters 
{ 
    public Nullable<System.DateTime> DateFrom { get; set; } 
    // many other properties 
} 

Таким образом, назначая теперь параметры поиска в IQueryOver<ExpenseReport>

var q = SessionProvider.QueryOver<ExpenseReport>(); 

И я теперь немного потерял с NHibernate .... Как это сделать сейчас?

q.And(/*** I AM STUCK HERE **/) 

ответ

4

разработан код должен выглядеть следующим образом:

// left side 
var left = Projections.Property<ExpenseReport>(ti => ti.PeriodFrom); 
// right side 
var right = Projections.SqlFunction("COALESCE" 
     , NHibernateUtil.DateTime 
     , Projections.Constant(search.DateFrom, NHibernateUtil.DateTime) 
     , Projections.Property<ExpenseReport>(ti => ti.PeriodFrom) 
    ); 
// the restriction using the GeProperty, taking two IProjections 
var restriction = Restrictions.GeProperty(left, right); 

// finally - our query get its WHERE 
q.Where(restriction); 

Итак, мы в первую очередь создать две проекции. Затем мы использовали утилиту Restrictions для создания >=(GeProperty). Окончательное ограничение окончательно передается в предложение WHERE ...

+0

Wow! Так легко, если я прочитаю ваш пост ... Мне нужно будет проверить позже :) –

+0

Отличное лидерство ... Я опубликовал следующий вопрос, ссылаясь на этот ответ, в надежде получить немного больше разъяснений по теме: http: //stackoverflow.com/questions/29221666/nhibernate-comparison-constraint-to-a-coalesced-date – beauXjames

+0

* Если я правильно прочитал вопрос, я попытался показать, как ... * –

Смежные вопросы