Frage

Ich versuche, eine einfache Abfrage zu schreiben, die einen Alias ​​erfordert, da es sich um eine Many-to-Many-Zuordnung handelt. Ich kann sie jedoch nicht mit NH Lambda Extensions zum Laufen bringen.Es gibt mir immer einen Kompilierungsfehler, obwohl es, soweit ich das beurteilen kann, genau mit der Dokumentation und allen Beispielen übereinstimmt, die ich online gesehen habe.

Funktioniert

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

Funktioniert nicht

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

Führt zu einem Build Error 22 The name 'zipAlias' does not exist in the current context

Intellisense hebt auch die CreateCriteria** hervor<County>** sagt, dass es die Methode nicht versteht, mir aber die Parameternamen korrekt anzeigt, wenn ich mich in den Klammern befinde.

War es hilfreich?

Lösung

Der Dokumentation ist voller praktischer Beispiele.

Dein zipAlias muss eine Variable im lokalen Bereich sein.

Zip zipAlias = null;
string zipCode = "";

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

Da der Dokumentationslink heruntergeladen und nicht gerendert wird, habe ich einige Abschnitte kopiert.

Erstellen Sie eine Kriterienzuordnung mit einem Alias
Verwendung der ursprünglichen ICriteria-API:

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

Verwendung von NHibernate Lambda-Erweiterungen:

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

Erstellen Sie eine Kriterien-Alias-Zuordnung mit Alias ​​und Join-Typ
Verwendung der ursprünglichen ICriteria-API:

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

Verwendung von NHibernate Lambda-Erweiterungen:

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");

Erstellen Sie eine Kriterienzuordnung mit Alias ​​und Join-Typ
Verwendung der ursprünglichen ICriteria-API:

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

Verwendung von NHibernate Lambda-Erweiterungen:

Child childAlias = null;
DetachedCriteria after =
    DetachedCriteria.For<Person>()
        .CreateCriteria((Person p) => p.Children, () => childAlias, JoinType.LeftOuterJoin)
            .Add<Child>(c => c.Nickname == "test");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top