目前,我有以下代碼:是否有可能重構這個nHibernate的Linq查詢?
switch (publicationType)
{
case PublicationType.Book:
return Session.Query<Publication>()
.Where(p => p.PublicationType == PublicationType.Book)
.OrderByDescending(p => p.DateApproved)
.Take(10)
.Select(p => new PublicationViewModel
{
...
});
case PublicationType.Magazine:
return Session.Query<Publication>()
.Where(p => p.PublicationType == PublicationType.Magazine)
.OrderByDescending(p => p.DateApproved)
.Take(10)
.Select(p => new PublicationViewModel
{
...
});
case PublicationType.Newspaper
....
}
正如你所看到的查詢是相同的除了publicationType條件各一次。我嘗試通過創建一個採用Func例如
private IEnumerable<PublicationViewModel> GetPublicationItems(Func<PublicationType, bool>> pubQuery)
{
return Session.Query<Publication>()
.Where(pubQuery)
.OrderByDescending(p => p.DateApproved)
.Take(10)
.Select(p => new PublicationViewModel
{
...
});
}
private bool IsBook(PublicationType publicationType)
{
return publicationType == PublicationType.Book;
}
,然後調用此方法像
GetPublicationItems(IsBook);
但是當我這樣做,我得到的錯誤: InvalidCastException的:無法投型「NHibernate.Hql.Ast.HqlParameter」的對象鍵入'NHibernate.Hql.Ast.HqlBooleanExpression'。
是否有另一種方法可以做到這一點?
真棒謝謝。我讓我的例子太簡單了,正如你所指出的,我可以直接將publicationType傳遞給查詢。但是你之後發佈的泛化正是我所追求的。 – Zac 2012-03-08 19:47:14