2011-10-20 1 views
1

나는 다소 큰 SOA 솔루션을 가지고 있으며 새로 추가 된 서비스는 NHibernate의 Query By Example을 사용하여 약 980 만 레코드를 쿼리합니다. 지금까지 성능이 끔찍 있으며, 데이터베이스에 대한 프로파일이 같이 쿼리를 보여줍니다좋아요와 같음과 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 사방 등의 연산자를 사용하고, 그것이 내가 그것을 설정하는 방법이기 때문에 나는 얻는다. 하지만 일부 필드를 같게 설정하고 일부 필드를 같게 설정할 수 있습니까? 저는 Zip5가 같아야하고 평등하게 지내야합니다 ...하지만 나머지는 좋아할 수 있습니다.

아니면 QBE를 망칠 뿐이므로 일반적인 기존 기준을 사용할 수도 있습니까?

답변

2

당신은 혼합 할 수

.ExcludeProperty("Zip5") 


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

또는

.ExcludeProperty("ADDRESS") 


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