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», тогда трансформатор вернет только список городов ...
Кто-нибудь знает, как я могу вернуть чистый список клиентов в этом случае?