2015-03-26 2 views
0

Я использую nHibernate для выполнения следующего запроса SQL Join для заполнения Mvc.SelectList, но у меня возникают проблемы. Работает SQL является:nHibernate QueryOver Complex Join Query to Mvc.SelectList

SELECT 
    tblUser.oid, 
    (tblPerson.forename + ', ' + tblPerson.surname + ' (' + tblOfficerType.officer_title) + ')' AS Name 
FROM domainfire_officer tblOfficer 
INNER JOIN domainfire_officer_type tblOfficerType ON tblOfficer.officer_type = tblOfficerType.oid 
INNER JOIN domainfire_person tblPerson ON tblPerson.oid = tblOfficer.person 
INNER JOIN core_user tblUser ON tblPerson.[user] = tblUser.oid 
ORDER BY tblPerson.surname, tblPerson.forename 

До сих пор у меня есть это, но я мог бы быть ложным здесь дерево так что не стесняйтесь, поправьте меня.

Person tblPerson = null; 
     Officer tblOfficer = null; 
     User tblUser = null; 

     var results = session.QueryOver<Officer>(() => tblOfficer) 
      .JoinQueryOver(p => p.Person,() => tblPerson) 
      .JoinQueryOver(u => u.User,() => tblUser) 
      .SelectList(list => list 
      .Select(() => tblUser.Oid) 
      .Select(() => string.Concat(tblPerson.Surname, " ", tblPerson.Forename, (tblOfficer.OfficerType == null ? "" : string.Concat(" (", tblOfficer.OfficerType.OfficerTitle, ")")))) 
     ).List<object[]>(); 

Любая помощь оценивается. Я получаю следующую ошибку.

Ссылка на объект не установлена ​​в экземпляр объекта.

Описание: Необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительной информации об ошибке и ее возникновении в коде.

Сведения об исключении: System.NullReferenceException: Ссылка на объект не установлена ​​в экземпляр объекта.

Источник ошибки: Строка 165: .SelectList (список => Список

ответ

1

Хорошо, я нашел эту проблему здесь Линия ниже неправильно:.

.Select(() => string.Concat(tblPerson.Surname, " ", tblPerson.Forename, (tblOfficer.OfficerType == null ? "" : string.Concat(" (", tblOfficer.OfficerType.OfficerTitle, ")")))) 

мне нужно иметь действительный лямбда (что правильный термин) выражение здесь, так что правильная версия:

var results = session.QueryOver<Officer>(() => tblOfficer) 
    .JoinQueryOver(p => p.Person,() => tblPerson) 
    .JoinQueryOver(u => u.User,() => tblUser) 
    .SelectList(list => list 
    .Select(() => tblUser.Oid) 
    .Select(() => tblPerson.Forename) 
    .Select(() => tblPerson.Surname) 
    .Select(() => tblOfficer.OfficerType.OfficerTitle) 
).List<object[]>(); 

Теперь мне просто нужно отформатировать его в в MVC SelectList, который, я уверен, могу понять. Хотя, если у кого-то есть элегантный способ сделать это, пожалуйста, не стесняйтесь.

Смежные вопросы