Obecnie mam następujący kod:Czy można refaktoryzować zapytanie 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
....
}
Jak widać kwerenda jest taka sama za każdym razem, z wyjątkiem warunku publicationType. Próbowałem to zmienić, tworząc metodę, która zajmuje Func np.
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;
}
a następnie wywołanie tej metody jak
GetPublicationItems(IsBook);
Ale kiedy to zrobić pojawia się błąd: InvalidCastException: Nie można rzutować obiektu typu „NHibernate.Hql.Ast.HqlParameter” wpisz "NHibernate.Hql.Ast.HqlBooleanExpression".
Czy jest inny sposób na zrobienie tego?
Niesamowite dziękuję. Zrobiłem mój przykład trochę zbyt prosty i jak zauważyłeś mogę po prostu przekazać publicationType prosto do zapytania. Ale uogólnienie, które napisałeś po tym wydarzeniu, było dokładnie tym, o co prosiłem. – Zac