Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可以重构这个nHibernate Linq查询吗?_C#_Linq_Nhibernate - Fatal编程技术网

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