Помощь с запросами условной проекции - PullRequest
1 голос
/ 14 июня 2011

У меня есть требование, при котором мне нужно отобразить список сотрудников и их ролей.Поэтому, если роль сотрудника - учет, я хочу отобразить имя и фамилию этого сотрудника.Ниже приведен мой код для него

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

Таблица ролей компании имеет идентификатор пользователя в качестве внешнего ключа для идентификатора первичного ключа таблицы User.Как можно получить поле Имя Фамилия в строках «Учетная запись» и «Менеджер» выше.Приведенный выше код не работает, и он помещает избыточные значения имен в обе строки.Кроме того, у меня есть поле LastName, и я хочу добавить это к FirstName в обеих строках.Кто-нибудь может объяснить, как мне этого добиться?Кроме того, в приведенном выше запросе я дважды использовал projection.property, что, как я знаю, неправильно, но я просто хотел дать представление о том, что я искал.

1 Ответ

1 голос
/ 20 июня 2011

это должно быть в выражении 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
}
...