2017-05-23 45 views
1

我的成員表有一個名爲Birthdate的可爲空的DateTime字段。我需要得到在未來n天有生日的會員。我嘗試了幾種方法,但都沒有工作。NHibernate如何獲得在以下n天有生日的會員

DateTime startDate = DateTime.Now; 
DateTime endDate = DateTime.Now.AddDays(n); 

GetAll().Where(
    x => x.BirthDate != null 
    && new DateTime(startDate.Year, x.BirthDate.Value.Month, x.BirthDate.Value.Day, 1, 1, 1) >= startDate 
    && new DateTime(endDate.Year, x.BirthDate.Value.Month, x.BirthDate.Value.Day, 1, 1, 1) <= endDate 
    ); 

不能通過x.BirthDate爲DateTime構造

GetAll().OrderByDescending(m => m.CreateDate) 
    .Where(x => x.BirthDate.HasValue 
     && (endDate - x.BirthDate.Value).Days <= n) 

拋出識別錯誤。

你知道任何工作和簡單的方法來做到這一點嗎?

+0

您是否曾嘗試在您開始過濾之前先偷看GetAll()'返回的內容? – yoger

回答

0

支持DateTimeDateTimeOffset上的一組屬性。你可以看到列表here。有一天,reference documentation也會有一個專門的Linq部分。 (已經承諾,尚未發佈。)

所以,猜你GetAll產生的IQueryable,你可以寫你的查詢方式:

var startDate = DateTime.Now; 
var endDate = DateTime.Now.AddDays(n); 
if (startDate.Year == endDate.Year) 
{ 
    // Simple case, just compare months and days. 
    GetAll().Where(
     x => x.BirthDate.Value.Month >= startDate.Month && 
      x.BirthDate.Value.Day >= startDate.Day && 
      x.BirthDate.Value.Month <= endDate.Month && 
      x.BirthDate.Value.Day <= endDate.Day); 
} 
else 
{ 
    // Range spanning two distinct years, so matching dates 
    // are either lower months and days than endDate, OR 
    // greater months and days than startDate. (Cannot have both.) 
    GetAll().Where(
     x => x.BirthDate.Value.Month >= startDate.Month && 
      x.BirthDate.Value.Day >= startDate.Day || 
      x.BirthDate.Value.Month <= endDate.Month && 
      x.BirthDate.Value.Day <= endDate.Day); 

} 

我已刪除的檢查上HasValue:如果查詢轉換到SQL,在這種情況下SQL不需要它。

它應該與一起工作的方式,我相信它支持相同的DateTime屬性。

相關問題