2010-03-15 2 views
2

I "м, имеющие некоторые проблемы с NHibernate и родной SQL.NHibernate Native SQL несколько объединения

У меня есть сущность с многими коллекций, и я делаю поиск в SQL полнотекстового на нем. Таким образом, при возврате 100 или поэтому лицам, я не хочу, чтобы все коллекции поленитесь загружены Для этого я изменил мою SQL-запрос:.

SELECT Query.* 
FROM  (SELECT {spr.*}, 
       {adr.*}, 
       {adrt.*}, 
       {cty.*}, 
       {com.*}, 
       {comt.*},     
       spft.[Rank] AS [Rak], 
       Row_number() OVER(ORDER BY spft.[Rank] DESC) AS rownum 
      FROM customer spr 
       INNER JOIN CONTAINSTABLE (customerfulltext , computedfulltextindex , '" + parsedSearchTerm + @"') AS spft 
        ON spr.customerid = spft.[Key] 
       LEFT JOIN [Address] adr 
        ON adr.customerid = spr.customerid 
       INNER JOIN [AddressType] adrt 
        ON adrt.addresstypeid = adr.addresstypeid 
       INNER JOIN [City] cty 
        ON cty.cityid = adr.cityid 
       LEFT JOIN [Communication] com 
        ON com.customerid = spr.customerid 
       INNER JOIN [CommunicationType] comt 
        ON comt.communicationtypeid = com.communicationtypeid) as Query 
ORDER BY Query.[Rank] DESC 

Это, как я настроить запрос:

 var items = GetCurrentSession() 
      .CreateSQLQuery(query) 
      .AddEntity("spr", typeof(Customer)) 
      .AddJoin("adr", "spr.addresses") 
      .AddJoin("adrt", "adr.Type") 
      .AddJoin("cty", "adr.City") 
      .AddJoin("com", "spr.communicationItems") 
      .AddJoin("comt", "com.Type") 
      .List<Customer>(); 

что происходит сейчас, что дие ry возвращает клиентов дважды (или больше), я предполагаю, что это происходит из-за объединений, поскольку для каждого адреса клиента, communicationItem (например, телефон, электронная почта), возвращается новая строка sql. В этом случае я думал, что могу использовать DistinctRootEntityResultTransformer.

 var items = GetCurrentSession() 
      .CreateSQLQuery(query) 
      .AddEntity("spr", typeof(Customer)) 
      .AddJoin("adr", "spr.addresses") 
      .AddJoin("adrt", "adr.Type") 
      .AddJoin("cty", "adr.City") 
      .AddJoin("com", "spr.communicationItems") 
      .AddJoin("comt", "com.Type") 
      .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
      .List<Customer>(); 

Выполнение исключения исключение. Это связано с тем, что я пытаюсь перечислить клиентов .List<Customer>(), но трансформатор возвращает только объекты последнего добавленного соединения. Например. в приведенном выше случае объект с псевдонимом «comt» возвращается при выполнении .List() вместо .List<Customer>(). Если бы я переключил последнее соединение с псевдонимом соединения «cty», тогда трансформатор вернет только список городов ...

Кто-нибудь знает, как я могу вернуть чистый список клиентов в этом случае?

ответ

1

попробовать этот

var items = GetCurrentSession()  
.CreateSQLQuery(query)    
.AddEntity("spr", typeof(Customer))    
.AddJoin("adr", "spr.addresses")    
.AddJoin("adrt", "adr.Type")    
.AddJoin("cty", "adr.City")    
.AddJoin("com", "spr.communicationItems")    
.AddJoin("comt", "com.Type") 
.AddEntity("spr", typeof(Customer))       
.SetResultTransformer(new DistinctRootEntityResultTransformer())    
.List<Customer>(); 
0
GetCurrentSession.CreateQuery("select distinct spr from Customer spr inner join spr.Addresses 
adr inner join adr.Type adrt inner join adr.City cty inner join apr.CommunicationItems com 
inner join com.Type comt").List<Customer>(); 

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

GetCurrentSession.CreateSqlQuery(sqlquery).List<Customer>(); 
Смежные вопросы