2012-08-23 5 views
1

Nhibernate를 사용 중이며 복합 키 목록을 사용하여 레코드 집합을 검색하기 위해 코드 별 매핑이 사용됩니다. 나는이 같은 복합 키를 사용하고 있습니다 :단일 쿼리와 복합 키로 레코드 집합을 검색하기 위해 NHibernate 사용하기

public class PersonAccountKey : IKey 
{ 
     public virtual string PersonId { get; set; } 
     public virtual string AccountNo{ get; set; } 

     public override bool Equals(object obj) 
     { 
      if (obj == null) 
       return false; 
      var t = obj as PersonKey; 
      if (t == null) 
       return false; 
      if (PersonId == t.PersonId && AccountNo == t.AccountNo) 
       return true; 
      return false; 
     } 
     public override int GetHashCode() 
     { 
      return (PersonId).GetHashCode() + "|" + (AccountNo).GetHashCode(); 
     } 
} 

을 PersonAccountKey 오브젝트의 목록으로, 내가 NHibernate에 데이터베이스까지 단일 쿼리를 보내려고하고있다. 쿼리가 다음과 같이 보일 것이라고 생각합니다.

Select PersonId, AccountNo, AccountNickName 
From PersonAccount 
Where (PersonId = '11' and AccountNo = '10001111') 
or (PersonId = '22' and AccountNo = '10001150') 

잘 모르겠습니다. 복합 키를 사용하여 Criteria를 사용하려고 시도했지만, 함께 사용하는 것은 아닙니다. 나는 지금 Linq 2 NHibernate를 시도하고 있지만 실제로 어느 곳으로도 갈 수 없다.

이상적으로, 나는 그런 Session.Get<T>(IEnumerable<object>)로 키는 IEnumerable을 할 방법을 싶지만, 이건 내 검색에서 존재하지 않습니다.

NHibernate에서이 기능을 사용할 수 있습니까?

건배.

답변

0

스칼라 ID와 달리 합성 키 목록을 쿼리 매개 변수로 사용하는 직접적인 지원은 없습니다. 이것은 복합 키를 피해야하는 또 다른 예입니다.

IEnumerable<PersonAccountKey> keys = GetKeys(); 
var query = session.CreateCriteria<PersonAccount>(); 
var keyCriterion = Restrictions.Disjunction(); 
foreach (var key in keys) 
    keyCriterion.Add(Restrictions.Eq("id", key)); 
query.Add(keyCriterion); 
var result = query.List<PersonAccount>(); 
+0

완벽한 :

여기에 쉬운 해결 방법입니다. 복합 키는 피해야하지만, 기존 데이터베이스를 사용하여 수행 할 수있는 작업은 무엇입니까? –

+0

리팩터링 할 수 있습니다. 예 :-) –

0

MSDN에 대한 기사는 Enumerable.Contains인데, 내가 생각하는대로 수행됩니다.

NHibernate의 linq가 이것을 전혀 지원하는지 모르겠습니다. 예외로 처리를 거부 할 수 있습니다.