NHibernate: связанные свойства не выбираются с нетерпением - PullRequest
0 голосов
/ 07 февраля 2012

Проблема

Во-первых: новичок в 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 */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...