0

多対多の関連付けであるため、エイリアスを必要とする単純なクエリを作成しようとしていますが、NHLambdaExtensionsで機能させることができません。私が知る限り、それは私がオンラインで見たドキュメントやすべての例とまったく同じであるとはいえ、それは常に私にコンパイルエラーを与えます。

作品

var query = DetachedCriteria.For<County>()            
    .CreateCriteria("Zips", "zipAlias", JoinType.LeftOuterJoin)
    //.CreateCriteria<County>(x => x.Zips, 
    //                              () => zipAlias, JoinType.LeftOuterJoin)
    .Add<Zip>(zip => zip.ZipCode == zipCode);

動作しません

var query = DetachedCriteria.For<County>()            
    //.CreateCriteria("Zips", "zipAlias", JoinType.LeftOuterJoin)
    .CreateCriteria<County>(x => x.Zips, 
                                    () => zipAlias, JoinType.LeftOuterJoin)
    .Add<Zip>(zip => zip.ZipCode == zipCode);

ビルドの結果Error 22 The name 'zipAlias' does not exist in the current context

Intellisenseは、CreateCriteria ** <County>**も強調表示して、メソッドを理解していないと言っていますが、パラメーター内にいるときはパラメーター名を正しく表示します。

4

1 に答える 1

4

ドキュメントには便利な例がたくさんあります。

ローカルスコープzipAliasの変数である必要があります。

Zip zipAlias = null;
string zipCode = "";

var query = DetachedCriteria.For<County>()
    .CreateCriteria<County>(x => x.Zips, () => zipAlias, JoinType.LeftOuterJoin)
    .Add<Zip>(zip => zip.ZipCode == zipCode);

ドキュメントリンクがレンダリングではなくダウンロードされるので、いくつかのセクションをコピーしました。


オリジナルのICriteriaAPIを使用して、エイリアスとの基準の関連付けを作成します。

ICriteria before = CreateSession()
    .CreateCriteria(typeof(Person))
        .CreateCriteria("Children", "childAlias")
            .Add(Restrictions.Eq("Nickname", "test"));

NHibernate Lambda拡張機能の使用:

Child childAlias = null;
ICriteria after = CreateSession()
    .CreateCriteria(typeof(Person))
        .CreateCriteria((Person p) => p.Children, () => childAlias)
            .Add<Child>(c => c.Nickname == "test");


元のICriteriaAPIを使用して、エイリアスと結合タイプを使用して基準エイリアスの関連付けを作成します。

ICriteria before = CreateSession()
    .CreateCriteria(typeof(Person), "personAlias")
        .CreateCriteria("personAlias.Children", "childAlias", JoinType.LeftOuterJoin)
            .Add(Restrictions.Eq("Nickname", "test"));

NHibernate Lambda拡張機能の使用:

Person personAlias = null;
Child childAlias = null;
ICriteria after = CreateSession()
    .CreateCriteria(typeof(Person), () => personAlias)
        .CreateCriteria(() => personAlias.Children, () => childAlias, JoinType.LeftOuterJoin)
            .Add<Child>(c => c.Nickname == "test");


オリジナルのICriteriaAPIを使用して、エイリアスと結合タイプを使用して基準の関連付けを作成します。

DetachedCriteria before =
    DetachedCriteria.For<Person>()
        .CreateCriteria("Children", "childAlias", JoinType.LeftOuterJoin)
            .Add(Restrictions.Eq("Nickname", "test"));

NHibernate Lambda拡張機能の使用:

Child childAlias = null;
DetachedCriteria after =
    DetachedCriteria.For<Person>()
        .CreateCriteria((Person p) => p.Children, () => childAlias, JoinType.LeftOuterJoin)
            .Add<Child>(c => c.Nickname == "test");
于 2010-03-18T15:13:58.303 に答える