나는 질의를 빠르게하기 위해 Criteria를 사용하고 있으며 거의 다 왔어.NHibernate Criteria QueryByExample은 중간에 SQL이 붙어있다.
예를 들어 테이블에서 행을 일치 시키려면 동일한 ID를 가진 중복 행을 제거한 다음 페이지 매김을하십시오.
물론 중복 행을 제거 할 때까지 페이지를 매길 수 없으며 그 방법을 모르겠습니다. 그것은 SQL에서 할 수 있지만 유창한 코드에 맞으면 ISQLQuery는 ICriteria 객체를 반환하지 않습니다. 내가 읽은
public IList<EntitySearch> CriteriaSearch(EntitySearch exampleEntitySearch, int startingPage, int pageSize)
{
var startRow = startingPage * pageSize;
// Query By Example.
var example = Example.Create(exampleEntitySearch)
.IgnoreCase()
.EnableLike(MatchMode.Anywhere)
.ExcludeZeroes();
var results = this.Session.CreateCriteria(typeof(EntitySearch))
.Add(example)
// select * from (SELECT ROW_NUMBER()OVER (partition by Id order by Id) As rankOrder, * FROM EntitySearch) as original where original.rankOrder = 1
.SetFirstResult(startRow)
.SetMaxResults(pageSize)
.List<DealSearch>();
return results;
}
조언 NHibernate에있는 SQL 쿼리를 작성하는 것입니다,하지만 난 멋진 "파티션 SQL을 통해 ROW_NUMBER()"를 변환하는 방법을 생각할 수 없다. 나는 그것을 끝내기 위해 일을 끝내고 싶다. 그러면 더 우아하게 만들어야한다.
저는이 스파이크를 생산에 적용하고 ~ 90 %의 속도 향상을 원합니다.
변경 :
.List<DealSearch>();
사람 : LINQ
그럼 당신은 NHibernate에이 하드 코딩 된 SQL을 실행 할 수 있습니다 당신의 코드는 그렇지만 NHibernate가 타입 안전성 (클래스의 맵에서 DB 객체로의 강력한 타이핑), DB 엔진에 대한 불가지론 (더 복잡한 SQL은 모든 DB에서 실행되지 않을 것입니다)과 같은 장점을 제공합니다. 게으른 로딩, 절대적으로 필요하고 당신이 DB 엔진을 결코 절대로 바꾸지 않을 것이라는 점을 확신하지 않는 한, NHibernate를 가진 부호에서 하드 코딩 된 SQL을 사용하지 않는 것이 좋습니다. –
하드 코딩 된 SQL이 아무 것도없는 것보다 낫습니다. 두렵습니다. 좀 더 자세히 살펴보면, Criteria는 올바른 순서 일 필요가 없으며 ExpressionSQL을 사용할 수 있어야합니다. 내 쿼리는 각 하위 그룹의 첫 번째 항목을 취하기 위해 파티션에 대해 ROW_NUMBER를 사용하는 SQL의 특정 비트까지 내려갔습니다. 페이지 매기기 전에 필요합니다. – zeristor
이 포럼에서 당신을 도울 수있는 숙련 된 팀이 있습니다 : http://sqlserver.ro, 시도하십시오 –