0

我在 TaskRepository 中有这段代码:

public List<Task> GetActiveTasks()
    {

        return SessionContainer.Session
            .Query<Task>()
            .Where(t => t.IsActive())
            .ToList();
    }

这是任务类中的 IsActive() 方法

public virtual bool IsActive()                                 
{
 return States.ToList().Max().Name == "Active";
}

我的问题是GetActiveTasks()返回NotSupportedException

有谁知道什么问题?我认为不可能在 Where 谓词中调用实例方法。如果这不可能,是否有任何解决方法?我需要完成所有活动任务,但如果不是这样,我不知道该怎么做。

4

2 回答 2

1

Query 中给出的 lambdas 必须转换为 sql。NHibernate 应该如何解释你实现的方法?它不能。但是,您可以将 IsActive 映射为 Formula 属性并对其进行查询。就像是:

Map(x => x.IsActive).Formula("(SELECT ... FROM (Select s.Name FROM States s WHERE s.task_id = Id ORDER BY Id desc LIMIT 1) maxState WHERE maxState.Name == Active)")
于 2013-01-22T05:34:24.217 回答
0

一种选择是重构 Task 类,如下所示:

public static Expression<Func<Task, bool>> IsActiveExpr =
    (task) => task.States.Max().Name == "Active";
private static Func<Task, bool> _IsActiveCompiled = IsActiveExpr.Compile();

public virtual bool IsActive()                                 
{
    return IsActiveCompiled(this);
}

现在您可以在 LINQ 查询中使用 IsActiveExpr。

另一种选择是扩展 NHibernate 查询提供程序,以便它直接识别 IsActive() 方法。进行搜索,或者例如查看我对这个问题的回复:Lambda string as VARCHAR。但可能需要注意避免重复逻辑。

于 2013-01-22T08:09:07.380 回答