У меня проблемы с Nhibernate и собственным 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>();
Что происходит сейчас, так это то, что запрос возвращает клиентов дважды (или более), я предполагаю, что это из-за объединений, поскольку для каждого адреса клиента, 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", то преобразователь возвращает список только городов ...
Кто-нибудь знает, как я могу вернуть чистый список клиентов в этом случае?