1

J'ai une exigence dans laquelle j'ai besoin d'afficher une liste d'employés et leurs rôles. Donc, si le rôle de l'employé est Comptabilité, je veux afficher Prénom et Nom de cet employé. Ci-dessous mon code pour elleAide pour les requêtes de projection conditionnelle

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

Le tableau de rôle de la société a userid comme une clé étrangère à l'ID clé primaire de la table utilisateur. Comment est-il possible d'obtenir le champ Firstname Lastname dans les chaînes "Account" et "Manager" ci-dessus. Le code ci-dessus ne fonctionne pas et il met des valeurs redondantes de noms dans les deux la chaîne. En outre, j'ai un champ LastName et je veux ajouter cela au FirstName dans les deux les chaînes. Quelqu'un peut-il s'il vous plaît expliquer comment vais-je y parvenir? De plus, dans la requête ci-dessus, j'ai utilisé deux fois la propriété projections.property, mais je voulais juste donner une idée de ce que je cherchais.

Répondre

1

doit-il être dans l'instruction SQL? Ne suffirait-il pas à:

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 
}