Aiutare con le query di proiezione condizionale
-
27-10-2019 - |
Domanda
Ho un requisito in cui ho bisogno di visualizzare un elenco di dipendenti e loro ruoli. Quindi, se il ruolo del dipendente è contabile, voglio mostrare il primo nome e il lastname di quel dipendente. Di seguito è il mio codice per questo
SearchTemplate RoleTemplate = new SearchTemplate();
RoleTemplate.Criteria = DetachedCriteria.For(typeof(CompanyRole), "CR");
RoleTemplate.Criteria.CreateCriteria("User", "User")
.SetProjection(Projections.ProjectionList()
.Add((Projections.Conditional
(Restrictions.Eq("CR.Role", Role.Accounting),
Projections.Property("User.FirstName"), Projections.Property("User.FirstName"))), "Account")
.Add((Projections.Conditional
(Restrictions.Eq("CR.Role", Role.Manager),
Projections.Property("User.FirstName"), Projections.Property("User.FirstName"))), "Manager"));
La tabella di ruolo dell'azienda ha UserID come chiave esterna per l'ID chiave primaria della tabella utente. Come è possibile ottenere il campo LastName FirstName in "Account" e "Manager" Strings sopra. Il codice sopra non funziona e mette i valori ridondanti di nomi in entrambe le stringhe. Inoltre, ho un campo LastName e voglio aggiungerlo al primo nome in entrambe le corde. Qualcuno può spiegare come raggiungerò questo? Inoltre, nella query sopra ho usato proiezioni. Property due volte che so è sbagliato, ma volevo solo dare un'idea di ciò che stavo cercando.
Soluzione
Deve essere nell'istruzione SQL? Non sarebbe sufficiente:
var result = CreateCriteria<User>()
.CreateAlias("CompanyRole", "cr")
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("FirstName"))
.Add(Projections.Property("LastName"))
.Add(Projections.Property("cr.Role"))
)
.List<object[]>();
foreach (var item in result)
{
string name = string.Concat(item[0], item[1]);
Role role = (Role)item[2];
// do something with name and role
}