C# 可以重构这个nHibernate Linq查询吗?
目前我有以下代码:C# 可以重构这个nHibernate Linq查询吗?,c#,linq,nhibernate,C#,Linq,Nhibernate,目前我有以下代码: switch (publicationType) { case PublicationType.Book: return Session.Query<Publication>() .Where(p => p.PublicationType == PublicationType.Book) .OrderByDescending(p => p.DateApproved)
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
....
}
但当我这样做时,我得到了一个错误:
InvalidCastException:无法将类型为“NHibernate.Hql.Ast.HqlParameter”的对象强制转换为类型为“NHibernate.Hql.Ast.HqlBooleanExpression”
还有其他方法吗?听起来你并不真的需要一个函数-你只需要一个
PublicationType
:
private IEnumerable<PublicationViewModel>
GetPublicationItems(PublicationType type)
{
return Session.Query<Publication>()
.Where(p => p.PublicationType == type)
.OrderByDescending(p => p.DateApproved)
.Take(10)
.Select(p => new PublicationViewModel
{
...
});
}
或:
private静态只读表达式IsBook=
p=>p.PublicationType==PublicationType.Book;
...
GetPublicationItems(IsBook)
在查询中不能只使用publicationType有什么原因吗
return Session.Query<Publication>()
.Where(p => p.PublicationType == publicationType)
.OrderByDescending(p => p.DateApproved)
.Take(10)
.Select(p => new PublicationViewModel
{
...
});
return Session.Query()
.其中(p=>p.PublicationType==PublicationType)
.OrderByDescending(p=>p.DateApproved)
.Take(10)
.选择(p=>new PublicationViewModel
{
...
});
您的错误是将代理与表达式树混淆
Func是一个委托,不能转换为SQL。
你可以这样写:
Session.Query<Publication>()
.Where(p => p.PublicationType == yourPubilcationType)
...
Session.Query()
.Where(p=>p.PublicationType==yourPubilcationType)
...
或者,如果您希望通过该方法的过滤器,如您在示例中所暗示的:
IEnumerable<PublicationViewModel> GetPublicationItems(Expression<Func<PublicationType, bool>> pubQuery)
{
return Session.Query<Publication>()
.Where(pubQuery)
.OrderByDescending(p => p.DateApproved)
.Take(10)
.Select(p => new PublicationViewModel
{
...
});
}
IEnumerable GetPublicationItems(表达式pubQuery)
{
返回会话。查询()
.Where(pubQuery)
.OrderByDescending(p=>p.DateApproved)
.Take(10)
.选择(p=>new PublicationViewModel
{
...
});
}
太棒了,谢谢。我的示例太简单了,正如您所指出的,我可以直接将publicationType传递到查询中。但你在那之后发布的概括正是我想要的。
GetPublicationItems(p => p.PublicationType == PublicationType.Book)
private static readonly Expression<Func<Publication, bool>> IsBook =
p => p.PublicationType == PublicationType.Book;
...
GetPublicationItems(IsBook)
return Session.Query<Publication>()
.Where(p => p.PublicationType == publicationType)
.OrderByDescending(p => p.DateApproved)
.Take(10)
.Select(p => new PublicationViewModel
{
...
});
Session.Query<Publication>()
.Where(p => p.PublicationType == yourPubilcationType)
...
IEnumerable<PublicationViewModel> GetPublicationItems(Expression<Func<PublicationType, bool>> pubQuery)
{
return Session.Query<Publication>()
.Where(pubQuery)
.OrderByDescending(p => p.DateApproved)
.Take(10)
.Select(p => new PublicationViewModel
{
...
});
}