Смешивать равные и равные с NHibernate Query-By-Example? - PullRequest
1 голос
/ 20 октября 2011

У меня довольно большое SOA-решение, и недавно добавленный сервис запрашивает около 9,8 миллионов записей, используя NHibernate Query By Example. До сих пор производительность была ужасной, и профиль в базе данных показывает запрос как:

exec sp_executesql N'SELECT this_.Id as Id3_0_, this_.ESIID as ESIID3_0_, this_.ADDRESS as ADDRESS3_0_, this_.ADDRESS_OVERFLOW as ADDRESS4_3_0_, this_.CITY as CITY3_0_, this_.STATE as STATE3_0_, this_.ZIP5 as ZIP7_3_0_, this_.ZIP4 as ZIP8_3_0_, this_.DUNS as DUNS3_0_, this_.PREMISE_TYPE as PREMISE10_3_0_, this_.STATUS as STATUS3_0_, this_.METER_READ_CYCLE as METER12_3_0_, this_.STATIONCODE as STATION13_3_0_ FROM vw_TDSP_ESIID this_ WHERE (lower(this_.ADDRESS) like lower(@p0) and lower(this_.CITY) like lower(@p1) and lower(this_.STATE) like lower(@p2) and lower(this_.ZIP5) like lower(@p3) and lower(this_.ZIP4) like lower(@p4))',N'@p0 nvarchar(10),@p1 nvarchar(2),@p2 nvarchar(4),@p3 nvarchar(7),@p4 nvarchar(2)',@p0=N'%110 Main%',@p1=N'%%',@p2=N'%TX%',@p3=N'%77002%',@p4=N'%%'

Итак, мой код выглядит так:

var queryEx = Example.Create(esiIdEntityProto)
            .EnableLike(MatchMode.Anywhere)
            .ExcludeNulls()
            .ExcludeZeroes()
            .IgnoreCase();

NHib везде использует оператор like, который я получаю, потому что так я его настроил. Но возможно ли настроить некоторые поля, чтобы они были похожими, а некоторые - равными? Мне нужно, чтобы Zip5 был РАВНЫМ, а состояние - РАВНЫМ ... но остальное может быть КАК.

Или я просто испортил QBE, чтобы я мог использовать обычные старые критерии?

1 Ответ

2 голосов
/ 21 октября 2011

вы можете смешать

.ExcludeProperty("Zip5")


.Add(example).Add(Restrictions.Eq("Zip5", esiIdEntityProto.Zip5))

или

.ExcludeProperty("ADDRESS")


.Add(example).Add(Restrictions.Like("ADDRESS", esiIdEntityProto.Address))
...