2011-08-01 3 views
1

나는 지역 변수 또는 로컬 속성이 내가 할 수있는 다른 어떤 옵션을 알고 싶어 너무NHibernate QueryOver 별칭으로 사용할 수있는 것은 무엇입니까?

ClassA _aliasA; 
_session.QueryOver(x => x.ClassA,() => _aliasA); 

또는

ClassA AliasA { get; set; } 
_session.QueryOver(x => x.ClassA,() => AliasA); 

같은 별칭으로 사용될 수 있다는 것을 지금까지 알고있다. 마찬가지로, 외부 클래스의 속성은 유효한 옵션입니까?

class ClassGenericAliases 
{ 
    ClassA Class { get; set; } 
} 

_session.QueryOver(x => x.ClassA,() => ClassGenericAliases.ClassA); 

정체를 별칭으로 사용할 수 있습니까? 별칭을 선언하는 다른 옵션이 있습니까?

답변

7

별칭을 사용하는 메서드 범위를 벗어난 별칭에는 아무 것도 사용하지 않는 것이 좋습니다.

QueryOver는 Criteria의 강력한 형식 버전이며 Criteria에서 별칭은 문자열 값입니다.

IList cats = sess.CreateCriteria(typeof(Cat)) 
    .CreateAlias("Kittens", "kt") 
    .CreateAlias("Mate", "mt") 
    .Add(Expression.EqProperty("kt.Name", "mt.Name")) 
    .List(); 

그러나 지금 우리가 그냥 하나 만들 수 있도록 변수에 별칭을 할당 할 필요가있다 :

http://nhibernate.info/doc/nh/en/index.html#queryqueryover-aliases

: NHForge 문서에서

Cat catAlias = null; 
Kitten kittenAlias = null; 

IQueryOver<Cat,Cat> catQuery = 
    session.QueryOver<Cat>(() => catAlias) 
     .JoinAlias(() => catAlias.Kittens,() => kittenAlias) 
     .Where(() => catAlias.Age > 5) 
     .And(() => kittenAlias.Name == "Tiddles"); 

를, 다음 말한다

15.5. 별칭

전통적인 ICriteria 인터페이스에서 별칭은 '마법 문자열'을 사용하여 할당되지만 해당 값은 개체 도메인의 이름과 일치하지 않습니다. 예를 들어 .CreateAlias ​​("Kitten", "kittenAlias")를 사용하여 별칭을 할당하면 문자열 "kittenAlias"는 이 도메인의 속성 또는 클래스와 일치하지 않습니다.

QueryOver에서 별칭은 빈 변수를 사용하여 할당됩니다. 변수는 어디에서나 선언 할 수 있지만 런타임에는 null이어야합니다. 컴파일러는 변수가 올바르게 사용되었지만 런타임에 변수가 평가되지 않는다는 구문을 확인할 수 있습니다 (별칭의 자리 표시 자로 사용되는 것은 입니다).

QueryOver 각 람다 식 함수 별명 사용을 허용하는 대응 과부하 및 서브 QueryOver을 만들지 않고 별명 사용 이송 연결에 .JoinAlias ​​기능을 갖는다.

그렇다면 메소드의 범위에서 변수를 사용하는 것뿐입니다.

+0

이러한 별칭을 다시 사용할 수있는 방법을 모색 중입니다.그럼, 그건 좋은 습관이 아니에요? 그러한 조인을 몇 번이고 다시 쓰는 것은 너무나 고통 스럽습니다. – Jonn

+0

너무 많은 복잡한 조인이 있으면 안됩니다. 그렇지 않으면 해결하려는 작업을 두 번 수행해야합니다. 쿼리에서 Eager 페치를 ​​재사용하기위한 페칭 전략을 작성할 수 있습니다. 이 쿼리를 재사용 할 수 없다는 말은 할 수 없습니다. 메서드에서 IQueryOver를 반환하고 더 많은 조건을 추가 할 수 있습니다. 하지만 일반적으로 별칭을 다시 사용할 수 없게하려고하지 않는 것이 가장 좋습니다. – Phill

2

비슷한 문제를 해결하고 별칭 명명 규칙을 결정해야했습니다. 그렇다면 별칭을 다시 사용해야하는 곳에서 GetCriteriaByAlias ​​()를 사용하여 별칭을 확인하고 거기에 없으면 추가 할 수 있습니다. 선택 사항이 다른 경우 별칭을 다시 사용할 수 있다는 것이 매우 유용합니다. 이 방법은 누군가가 이름 짓기 관례를 무시하면 문제가 될 수 있지만, 단원 검사는 그것을 고쳐야합니다.

Project aProject = null; 
if (root.UnderlyingCriteria.GetCriteriaByAlias("aProject") == null) 
    root.JoinAlias(i => i.Project,() => aProject); 
+0

나는 유사한 해결책으로 끝냈다. 실제로 사용하는 데 거의 1 년이 지나면 여러 번 디자인에 맞서 싸울 것이라고 말해야합니다. 단위 테스트를 작성하는 것은 당신에게 많은 도움이 될 것입니다. 그리고 우리가 가지고있는 것은 그것들을 전혀 재사용 할 수없는 것보다 더 쉽습니다. 나는 이제 다시 그것을해야한다는 것을 알고 있습니다. 나는 Nhib의 틀에 맞서 싸우지 않을 것입니다. – Jonn