Domanda

Sto cercando di scrivere una query semplice che richiede un alias poiché è un'associazione Many-To-Many, tuttavia non riesco a farla funzionare con NH Lambda Extensions.Mi dà sempre un errore di compilazione anche se per quanto ne so è esattamente uguale alla documentazione e a tutti gli esempi che ho visto online.

Lavori

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

Non funziona

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

Risultati in una build Error 22 The name 'zipAlias' does not exist in the current context

Intellisense evidenzia anche i CreateCriteria**<County>** dicendo che non capisce il metodo, tuttavia mi mostra correttamente i nomi dei parametri quando sono all'interno delle parentesi.

È stato utile?

Soluzione

IL documentazione è pieno di esempi utili.

Tuo zipAlias deve essere una variabile nell'ambito locale.

Zip zipAlias = null;
string zipCode = "";

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

Poiché il collegamento alla documentazione viene scaricato invece del rendering, ho copiato alcune sezioni.

Crea associazione criteri con alias
Utilizzando l'API ICriteria originale:

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

Utilizzo delle estensioni Lambda di Hibernate:

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

Crea criteri di associazione alias con alias e tipo di unione
Utilizzando l'API ICriteria originale:

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

Utilizzo delle estensioni Lambda di Hibernate:

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

Crea associazione di criteri con alias e tipo di join
Utilizzando l'API ICriteria originale:

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

Utilizzo delle estensioni Lambda di Hibernate:

Child childAlias = null;
DetachedCriteria after =
    DetachedCriteria.For<Person>()
        .CreateCriteria((Person p) => p.Children, () => childAlias, JoinType.LeftOuterJoin)
            .Add<Child>(c => c.Nickname == "test");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top