Проблема
Во-первых: новичок в NHibernate, в прошлом я использовал Entity Framework.
Я использую NHibernate 3.2, ASP.NET MVC3, так кака также AutoMapper, и обнаружили, что хотя
я получаю правильные результаты, отображаемые в моем представлении, но для десяти возвращенных строк я получаю 42 оператора SQL, которые выполняются: - один для общего числа строкв запросе - одна для 10 строк - две для каждой возвращенной строки, которая запрашивает мою таблицу DmsUser - я отключил сопоставления и обнаружил, что они соответствуют отношениям «один ко многим» BookedOutDrawingControllerUser и BookedOutContractorUser
Я хотел бы знать, почему имена пользователей, которые я показываю в моем представлении, не выбираются в начальном запросе для извлечения строк, и как я могу решить эту проблему.
Этопереписать существующее приложение, и решение, используемое в существующем приложении, является хранимой процедурой, но для всего приложения имеется только три процесса.Поскольку остальные запросы основаны на критериях NHibernate, я бы хотел отойти от существующего процесса.
Сокращенные объекты:
public class Drawing
{
public virtual int Id { get; set; }
...
public virtual string BookedOutContractor { get; set; }
public virtual DmsUser BookedOutDrawingControllerUser { get; set; }
public virtual DmsUser BookedOutContractorUser { get; set; }
public virtual string BookedOutDrawingControllerUsername { get; set; }
public virtual string BookedOutContractorUserName { get; set; }
}
public partial class DmsUser
{
public virtual string UserName { get; set; }
public virtual string FirstName { get; set; }
...
}
Править: добавлен полный запрос Запрос
IList<Drawing> results = _session.CreateCriteria<Drawing>()
.criteria.SetFirstResult(startIndex)
.Add(Restrictions.InsensitiveLike("Vault", x))
.Add(Restrictions.InsensitiveLike("Discipline", y))
.SetFetchMode("BookedOutDrawingControllerUser", FetchMode.Eager)
.SetFetchMode("BookedOutContractorUser", FetchMode.Eager)
.SetMaxResults(pageLength).List<Drawing>();
Сгенерированный SQL
Запрос на страницу данных:
SELECT TOP (10 /* @p0 */) this_.ID as ID5_2_,
this_.[relative path] as column2_5_2_,
this_.dmsDocumentId as dmsDocum3_5_2_,
this_.[Internal Name] as column4_5_2_,
this_.title as title5_2_,
this_.[Drawing Number] as column6_5_2_,
this_.[Drawing Revision] as column7_5_2_,
this_.[Drawing Discipline] as column8_5_2_,
this_.[Location Name] as column9_5_2_,
this_.fileName as fileName5_2_,
this_.[Booked Out] as column11_5_2_,
this_.[Booked Out To] as column12_5_2_,
this_.[Booked Out Date] as column13_5_2_,
this_.url as url5_2_,
this_.[Booked Out Contractor] as column15_5_2_,
this_.BookedOutDrawingControllerUsername as BookedO16_5_2_,
this_.BookedOutContractorUsername as BookedO17_5_2_,
this_.[booked Out Due Date] as column18_5_2_,
this_.vault as vault5_2_,
this_.BookedOutRequestID as BookedO20_5_2_,
dmsuser2_.ID as ID0_0_,
dmsuser2_.userName as userName0_0_,
dmsuser2_.[first name] as column3_0_0_,
dmsuser2_.[last name] as column4_0_0_,
dmsuser2_.[phone number] as column5_0_0_,
dmsuser2_.[mobile Number] as column6_0_0_,
dmsuser2_.[email address] as column7_0_0_,
dmsuser2_.Sponsored as Sponsored0_0_,
dmsuser2_.Sponsoror as Sponsoror0_0_,
dmsuser2_.[Access Type] as column10_0_0_,
dmsuser2_.[Access Level] as column11_0_0_,
dmsuser2_.LastLogin as LastLogin0_0_,
dmsuser2_.[Date Registered] as column13_0_0_,
dmsuser2_.Project as Project0_0_,
dmsuser2_.ActiveUser as ActiveUser0_0_,
dmsuser2_.CompanyId as CompanyId0_0_,
dmsuser3_.ID as ID0_1_,
dmsuser3_.userName as userName0_1_,
dmsuser3_.[first name] as column3_0_1_,
dmsuser3_.[last name] as column4_0_1_,
dmsuser3_.[phone number] as column5_0_1_,
dmsuser3_.[mobile Number] as column6_0_1_,
dmsuser3_.[email address] as column7_0_1_,
dmsuser3_.Sponsored as Sponsored0_1_,
dmsuser3_.Sponsoror as Sponsoror0_1_,
dmsuser3_.[Access Type] as column10_0_1_,
dmsuser3_.[Access Level] as column11_0_1_,
dmsuser3_.LastLogin as LastLogin0_1_,
dmsuser3_.[Date Registered] as column13_0_1_,
dmsuser3_.Project as Project0_1_,
dmsuser3_.ActiveUser as ActiveUser0_1_,
dmsuser3_.CompanyId as CompanyId0_1_
FROM Drawings this_
left outer join [User Details] dmsuser2_
on this_.BookedOutDrawingControllerUsername = dmsuser2_.userName
left outer join [User Details] dmsuser3_
on this_.BookedOutContractorUsername = dmsuser3_.userName
WHERE lower(this_.vault) like '%standard%' /* @p1 */
and lower(this_.[Drawing Discipline]) like '%e%' /* @p2 */
ORDER BY this_.title asc
Запросповторяется 20 раз:
SELECT dmsuser0_.ID as ID0_0_,
dmsuser0_.userName as userName0_0_,
dmsuser0_.[first name] as column3_0_0_,
dmsuser0_.[last name] as column4_0_0_,
dmsuser0_.[phone number] as column5_0_0_,
dmsuser0_.[mobile Number] as column6_0_0_,
dmsuser0_.[email address] as column7_0_0_,
dmsuser0_.Sponsored as Sponsored0_0_,
dmsuser0_.Sponsoror as Sponsoror0_0_,
dmsuser0_.[Access Type] as column10_0_0_,
dmsuser0_.[Access Level] as column11_0_0_,
dmsuser0_.LastLogin as LastLogin0_0_,
dmsuser0_.[Date Registered] as column13_0_0_,
dmsuser0_.Project as Project0_0_,
dmsuser0_.ActiveUser as ActiveUser0_0_,
dmsuser0_.CompanyId as CompanyId0_0_
FROM [User Details] dmsuser0_
WHERE dmsuser0_.userName = '' /* @p0 */