0

nHibernate3.2.0.4000を使用しています。nHibernate.Linqを使用してこのクエリを作成しました

var entities = (from t in this.Session.Query<Task>()
                where NotIn(t, role.Tasks)
                select t).ToList();

メソッドの定義は次のとおりですNotIn()

private bool NotIn(Task t, IEnumerable<TaskDto> tasks)
{
    foreach (var task in tasks)
    {
        if (t.Name == task.Name) return false;
    }
    return true;
}

このクエリを実行すると、NotSupportedExceptionエラーが発生します。

Boolean NotIn(Probel.NDoctor.Domain.DAL.Entities.Task, System.Collections.Generic.IEnumerable`1[Probel.NDoctor.Domain.DTO.Objects.TaskDto])

読みにくい非Linqソリューションを見つけましたが、少なくとも、このようなLinqクエリを作成できない理由を理解したいと思います。

よろしくお願いします!

4

4 に答える 4

2

NotIn式ツリーを使用してnHibernateSQLクエリに変換する必要があります。

nhibernatelinqプロバイダー拡張は良い出発点です。

このリンクにはInNotInnHibernateの拡張メソッドがあります。

于 2012-05-23T14:41:22.673 に答える
1

Linqのコードは、最終的にnhibernateによってSQLクエリに変換されます。SQLコードに変換できなかったメソッドは使用できません。

于 2012-05-23T14:31:29.153 に答える
0

代わりに以下を使用してください:

var entities = (from t in this.Session.Query<Task>()
                where !role.Tasks.Any(rt => rt.Name == t.Name)
                select t).ToList();
于 2012-05-23T14:36:17.640 に答える
0

NHibernateは、コードを逆コンパイルしてから解析して有効なSQLを取得することはできません。メソッドからSQLステートメントを生成する方法はありません。

于 2012-05-23T14:32:00.650 に答える