目前,我有以下代码:是否有可能重构这个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