gpt4 book ai didi

c# - 是否可以重构此 nHibernate Linq 查询?

转载 作者:太空狗 更新时间:2023-10-29 21:40:54 24 4
gpt4 key购买 nike

目前我有以下代码:

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:

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
{
...
});
}

如果您真的需要它比这更通用,您可能只需要更改代码以使用表达式树而不是委托(delegate)(并更改输入类型):

private IEnumerable<PublicationViewModel> GetPublicationItems(
Expression<Func<Publication, bool>> pubQuery)
{
return Session.Query<Publication>()
.Where(pubQuery)
.OrderByDescending(p => p.DateApproved)
.Take(10)
.Select(p => new PublicationViewModel
{
...
});
}

不过此时您将无法使用 GetPublicationItems(IsBook) 调用它。你可以这样做:

GetPublicationItems(p => p.PublicationType == PublicationType.Book)

或者:

private static readonly Expression<Func<Publication, bool>> IsBook =
p => p.PublicationType == PublicationType.Book;


...

GetPublicationItems(IsBook)

关于c# - 是否可以重构此 nHibernate Linq 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9623594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com