2012-06-10 3 views
3

나는 다음과 같은 시나리오를 가지고있다 : 고객은행에 은행 계좌를 가질 수있는 고객. 이 관계는합니다 (지도 태그를 사용하여 매핑)을 고객 클래스에 IDictionary로 설명되어NHibernate를 사용하여 키 - 값 컬렉션을 통해 쿼리하는 방법은 무엇입니까?

public class Customer 
{ 
    public virtual IDictionary<Bank, string> Banks 
    { 
     get { return _Banks; } 
     set { _Banks = value; } 
    } 
    private IDictionary<Bank, string> _Banks = new Dictionary<Bank, string>(); 
} 

IDictionary의 각 키는 고객이 계정이있는 은행을 나타냅니다, 그리고 문자열 값은이 질문과 관련이없는 간단한 상태입니다. 내가하고 싶은 무엇

지정된 은행에 계정이있는 모든 고객를 검색하는 NHibernate에 쿼리입니다. 나는 은행 클래스 (따라서 키워드가 은행을 참조한다) 안에이 시도 :

IList<Customer> customers = session.QueryOver<Customer>() 
            .Where(x => x.Banks.Keys.Contains(this)) 
            .List(); 

그리고 심지어 나는 다음과 같은 예외가 그것을 실행하려고하면 위의 쿼리가 오류없이 컴파일 생각 :

System.Exception : 인식 할 수없는 메서드 호출 : System.Collections.Generic.ICollection`1 [[Finance.Bank, Finance, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]] : 부울 .Bank)

그런데 어떻게 이런 종류의 쿼리를 올바르게 수행 할 수 있습니까? 감사!

PS : This SO questionISET 수집을 수행하는 방법을 보여줍니다, 그리고 this SO question은 내가 무엇을 시도하고있어하면 ICriteria API를 사용하지 못할 수 있음을 주장한다.

답변

1

더 많은 연구를 마친 후 에 포함 된 논리가 메서드를 SQL로 쉽게 변환 할 수 없다는 것을 깨달았습니다. 그래서 그 예외를 얻었습니다.

에 관심있는 사람들을위한

, 나는 다음과 같은 해결 방법을 함께했다 :

IList<Guid> customerIds = session.CreateSQLQuery(
      "SELECT Customer_ID FROM Banks WHERE Bank_ID = '" + this.ID + "'") 
      .List<Guid>(); 

Guid[] array = new Guid[customerIds.Count]; 
customerIds.CopyTo(array, 0); 

IList<Customer> customers = session.QueryOver<Customer>() 
       .Where(Restrictions.In("ID", array)).List(); 

을 우선은 주어진 Bank_ID 협회 테이블의 모든 CUSTOMER_IDS를 가져옵니다. 결과 목록 고객 ID은 두 번째 쿼리에서 고객 개체를 검색하는 데 사용됩니다.

PS :이 솔루션은 SQL 서버에 근무하지만 MySQL의로 전환 할 때 나는 그들이 다른 방식으로 Guid structure을 나타내므로 약간 변경했다.

관련 문제