2012-06-07 2 views
1

NHibernate를 사용하여 부모 자식 관계 사이의 상태 및 값을 기반으로 개체를 검색하기 위해 람다 식을 사용하려고합니다. AbstractWorkflowRequestInformation에는 WorkflowRequestInformationAction의 콜렉션이 있습니다. 두 클래스 각각에는 고유 한 Status 속성이 있습니다. 그들은이 쿼리와 관련된 여기에 설명하기 위해 축약 된 클래스는 다음과 같습니다예외 "지정된 메서드가 지원되지 않습니다."

public class AbstractWorkflowRequestInformation 
{ 
    public virtual RequestStatus RequestStatus { get; set; } 

    public virtual IEnumerable<WorkflowRequestInformationAction> 
     WorkflowRequestInformationActionList { get; set; } 
} 

public class WorkflowRequestInformationAction 
{ 
    public virtual ActionStatus Status { get; set; } 

    public virtual string RoleIdentifier { get; set; } 

    public virtual string RoleName { get; set; } 
} 

나는 List<KeyValuePair<string, string>>라는 역할에 따라 AbstractWorkflowRequestInformation 객체를 검색 할이 관계를 감안할 때. 나는 예외가 Any(...) 확장 메서드의 구문 분석의 부족으로 인해 발생하고 있음을 알고 있지만 대체 쿼리가 확실하지 않습니다. 지금까지 아래 쿼리의 모든 순열은 동일하거나 유사한 예외의 원인이 :

public IEnumerable<IRequestInformation> GetRequestsPendingActionBy(
     List<KeyValuePair<string, string>> roles) 
{ 
    var results = GetSession().Query<AbstractWorkflowRequestInformation>() 
     .Where(r => r.RequestStatus == RequestStatus.Pending 
        && r.WorkflowRequestInformationActionList 
         .Any(a => ActionStatus.Pending == a.Status 
            && roles.Any(kp => kp.Key == a.RoleName 
               && kp.Value == a.RoleIdentifier))) 
    .ToList(); 

    return results; 
} 

궁극적 인 목표는 보류중인 그 AbstractWorkflowRequestInformation 객체를 검색하고 열거 역할에 KeyValuePair 일치 보류 WorkflowRequestInformationAction하는 것입니다.

나는 더 귀한 ICriteria 표현이 있다면,이 표현이 이미 다루기 힘들어 졌기 때문에 람다 표현식을 사용하는 것에 집착하지 않는다. 내 roles List<KeyValuePair<string, string>>의 값을 기반으로 결과를 제한 할 수 있지만 "지정된 메소드가 지원되지 않음"예외를 방지하는 옵션은 무엇입니까?

+0

짧은 답변 ... NH Linq를 사용하지 마십시오 – dotjoe

+0

@dotjoe 저는 그 대답에 답할 만하지만 HQL, ICriteria 등을 사용하는 대안이 있습니까? – ahsteele

답변

1

...

WorkflowRequestInformationAction actionAlias = null; 

var q = GetSession().QueryOver<AbstractWorkflowRequestInformation>() 
    .Inner.JoinAlias(x => x.WorkflowRequestInformationActionList, 
         () => actionAlias) 
    .Where(x => x.RequestStatus == RequestStatus.Pending) 
    .And(() => actionAlias.Status == ActionStatus.Pending); 

var d = Restrictions.Disjunction(); 

foreach(var kvp in roles) 
{ 
    d.Add(Restrictions.Where(() => actionAlias.RoleName == kvp.Key 
            && actionAlias.RoleIdentitifier == kvp.Value)); 
} 

q.And(d).TransformUsing(Transformers.DistinctRootEntity); 

var results = q.List(); 

당신은 아마 NH Linq에와 유사한 접근 방식을 걸릴 수 있습니다. QueryOver/Criteria에 더 익숙해졌습니다.

+0

이것은 트릭을했습니다. 추가 읽기에 나는 확실히 NHibernate의 Linq 구현이 아직 프라임 타임에 대한 준비가되지 않았다는 결론에 도달했다. 누군가가 어딘가에서 말했듯이 거대한 베타 면책 조항이 있어야합니다. QuveryOver/Criteria를 사용하는 우아한 솔루션에 감사드립니다! – ahsteele

+0

좋은 소식입니다. 나는 NH devs가 Linq 공급자를 그만 뒀다고 생각한다. QueryOver를 사용하면 더 멋진 기능을 제공 할 수 있습니다. – dotjoe

+0

확실히 그런 것 같습니다. Linq는 "자연 스럽다"고 느끼기 때문에 불행한 상태가됩니다. 그것은 내가 느끼는 것 대 자연스러운 것을 사용하는 것을 선호한다고 말했습니다. ;) – ahsteele

1

NHibernate의 LINQ 공급자가 완전히 지원되지 않습니다. 공급자로부터 구문 분석되지 않은 표현식 트리 부분에서 확장 메서드를 실행하려고합니다.

post은이 문제를 해결하는 데 도움이 될 수 있습니다. 관련 게시물을 체크 아웃해야합니다.

또한 Fabio Maulo의 게시물 (NHibernate LINQ provider extension)을 참조하십시오. 나는이 같은 결과를 얻을 것이라고 생각

관련 문제