Le estensioni Lambda di Hibernate non possono utilizzare alcuna query di alias su DetachedCriteria
-
20-09-2019 - |
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.
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");