2011-06-02 87 views
3

之間的類型安全限制考慮以下QueryOver(季度和中心的變量傳遞):使用NHibernate的QueryOver,你怎麼可以加入紅棗

QueryOver.Of<Activity>() 
     .Where(Restrictions.On<Activity>(a => a.StartDate).IsBetween(quarter.StartDate).And(quarter.EndDate) || 
       Restrictions.On<Activity>(a => a.EndDate).IsBetween(quarter.StartDate).And(quarter.EndDate) || 
       Restrictions.And(Restrictions.Lt("StartDate", quarter.StartDate), Restrictions.Gt("EndDate", quarter.EndDate))) //TODO: Refactor this to remove magic strings 
     .And(a => a.Centre == centre) 
     .OrderBy(a => a.Title).Asc; 

這個查詢作品完美,但我想更改以下限制刪除魔術字符串:

Restrictions.And(Restrictions.Lt("StartDate", quarter.StartDate), Restrictions.Gt("EndDate", quarter.EndDate)) 

這裏是(剪斷,爲了簡潔)的實體:

public class Quarter 
{ 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 

} 

public class Activity 
{ 
    public string Title { get; set; } 
    public Centre Centre { get; set; } 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 

} 

public class Centre 
{ 
    public string Name { get; set; } 
} 

那麼,使用新的QueryOver擴展將使我能夠刪除這些魔術字符串的類型安全方式是什麼?

回答

6

這是你想要什麼:

Restrictions.And(
    Restrictions.Lt(Projections.Property<Activity>(x => x.StartDate), 
        quarter.StartDate), 
    Restrictions.Gt(Projections.Property<Activity>(x => x.EndDate), 
        quarter.EndDate))) 

旁註:屬性名是不是魔術字符串。

+0

這樣做的伎倆,謝謝! – andypike 2011-06-02 13:44:45

+3

對不起,如果它看起來像挑剔:但不應該大於開始日期和小於結束日期? – bernhardrusch 2012-09-12 14:21:48

+1

這也切斷記錄的日期完全等於start-或enddate。在大多數情況下,您想使用它: 'Restrictions.Le'和'Restrictions.Ge' – Hulvej 2014-04-21 13:23:43