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

クエリで指定されたラムダは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

1つのオプションは、次のように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を使用できます。

もう1つのオプションは、NHibernateクエリプロバイダーを拡張して、IsActive()メソッドを直接認識するようにすることです。検索を行うか、たとえば、この質問に対する私の回答を参照してください:VARCHARとしてのラムダ文字列。ただし、ロジックが重複しないように注意する必要がある場合があります。

于 2013-01-22T08:09:07.380 に答える