Помощь с условными проекционными запросами
-
27-10-2019 - |
Вопрос
У меня есть требование, в котором мне нужно отобразить список сотрудников и их роли. Так что, если роль сотрудника - бухгалтерский учет, я хочу показать первое имен и lastname этого сотрудника. Ниже мой код для этого
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"));
Таблица ролей Компании имеет идентификацию пользователя в качестве иностранного ключа к идентификатору первичного ключа пользователя. Как можно получить первое место в Lastname в строках «Учетная запись» и «Менеджер» выше. Приведенный выше код не работает, и он ставит избыточные значения имен в обеих строке. Кроме того, у меня есть поле Lastname, и я хочу добавить это к первое название в обеих струнах. Кто -нибудь может объяснить, как я это достигну? Кроме того, в приведенном выше запросе я использовал проекции. ПРОВОРКИ ДВАГО, ЧТО Я ЗНАЮ НЕПРАВИЛЬНО, но я просто хотел дать представление о том, что я искал.
Решение
Это должно быть в заявлении SQL? Разве не хватит:
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
}