2012-06-18 2 views
6

누군가가 NotSupportedException 극복 방법을 알고 있습니까? 나는 사용자에 대한 방법이 있습니다NHibernate NotSupportedException 극복

public virtual bool IsAbove(User otherUser) 
{ 
    return HeirarchyString.StartsWith(otherUser.HeirarchyString); 
} 

을 내가하고 싶은 :

_session.Query<User>.Where(x => loggedInUser.IsAbove(x)); 

을하지만 이것은 NotSupportedException이 발생합니다. 그래도 진짜 고통은 사용하는 것입니다

_session.Query<User>.Where(x => loggedInUser.HeirarchyString.StartsWith(x.HeirarchyString)); 

작품은 절대적으로 좋습니다. 그러나 IsAbove 메서드가 작동하는 방식을 변경하면 코드를 업데이트 할 때마다 코드를 복제 한 모든 위치를 기억해야하기 때문에 솔루션으로 이것을 좋아하지 않습니다.

+1

btw, "h ** IE ** rarchy":) – AakashM

+0

아, 나는 항상 사람들이 철자를 구할 수 없을 때를 지적합니다. 틀림없이 몇 년 동안 그 일이 잘못되었을 지 모르겠네. $ –

답변

3

이름을 명세 표현 및 재사용 예 :

public Expression<Func<....>> IsAboveSpecification = (...) => ...; 

public virtual bool IsAbove(User otherUser) 
{ 
    return IsAboveSpecification(HeirarchyString, otherUser.HeirarchyString); 
} 

필요에 따라 쿼리에서 IsAboveSpecification을 다시 사용하십시오. IsAbove() 메서드가 자주 사용되는 경우 use는 expression에 대해 Compile() 메서드의 결과를 캐시 할 수 있습니다.

+0

나는 OP와 같은 문제가있어. 이 솔루션을 사용할 수 없습니다. 처음에는 객체를 호출 할 수 있기를 원했기 때문에 'this'를 멤버 초기화 프로그램에서 사용할 수 없었기 때문에 초기화를 생성자로 옮겨야했습니다. 더 나쁜 것은 사양 표현을 호출하려고 할 때 "메소드, 대리자 또는 이벤트가 예상 됨"오류가 발생합니다. 어떤 제안? –

+0

식에 .Compile()을 호출하려고합니다. 식에 Invoke()를 호출합니다. 이제 컴파일되지만 쿼리에서 "IsAbove"함수를 호출 할 때 동일한 예외가 발생합니다. –

+0

몇 가지 이유로 쿼리에서 표현식을 호출 할 수 없습니다. 먼저 공개로 표시되면 NH는 필드를 보호해야하거나 개인이어야한다고 불평합니다. 둘째, 외부 쿼리에서 호출 할 때 위와 같은 "메서드, 대리자 또는 이벤트 예상"컴파일러 오류가 발생했습니다. –

관련 문제