2014-11-05 7 views
2

CreateCriteria을 사용하여 간단한 유형의 모음을 쿼리하려면 어떻게해야합니까? 단 1 열이간단한 유형 모음집에 CreateCriteria

  • 시험 : 아이디
  • 2 열
  • 값 : 시험 ID과 가치
  • 예를 들어

    , 나는 그것을 지원하기 위해 1 개 클래스

    public class Test 
    { 
        public virtual Guid Id { get; set; } 
    
        private ICollection<int> _values = new HashedSet<int>();   
        public virtual ICollection<int> Values 
        { 
         get { return _values; } 
        } 
    } 
    

    그리고이 테이블이

내 목표는을 사용하여 다음 쿼리를 다시 작성하는 것입니다. :이 시도

select * from test t 
inner join values v on v.TestId = t.Id 
where v.Value = 10 

: 나는 분명히 개체의 수집 및, 그것을 할 것처럼

Session.CreateCriteria<Test>("test") 
    .CreateAlias("test.Values", "values") 
    .Add(Restrictions.Eq("values", 10)) 
    .List(); 

, 실패했습니다. 조인은 정확하지만 제한을 추가하는 방법은 무엇입니까?

답변

1

질문에도 불구하고 대신 IList<ValueEntity>을 사용하는 것이 좋습니다.

값이 ([dbo]. [values]) 인 테이블에 고유 한 대리 ID 열이있을 수있는 경우에만 작동합니다. 나는. ID, TestId, Value 새 엔티티 ValueEntity을 소개하고이를 첫 번째 수준의 시민으로 매핑 할 수 있습니다. 쿼리하면 서브 쿼리를 포함하여 훨씬 더 간단해질 것입니다.

하지만 여기에는 질문이 없습니다.

그리고 사실 해결책이 있습니다. 위의 질문에 대한 답이 있습니다. 그러나, 적어도 IList<int> 수집 쿼리에 대한

NHibernate에 솔루션입니다 ... 위의 제안을 고려해보십시오 :

Session.CreateCriteria<Test>("test") 
    .CreateAlias("test.Values", "values") 
    // we add magic keyword ".elements" here 
    .Add(Restrictions.Eq("values.elements", 10)) 
    .List(); 

는 조금 inproperly here을 설명하는 ".elements"를 참조하십시오. 또한 비슷한 질문에 대한 답을 제공했습니다 : NHibernate How do I query against an IList<string> property?

+1

대단히 고맙습니다. – user1582878

0

elements을 사용한 접근 방식은 저에게 효과적이지 않았습니다. 당신이 볼 수 있듯이 어떻게 든 자 NHibernate가

CurrentSession.CreateCriteria<EmployeeIntranetSettings>("settings") 
    .CreateAlias("settings.DefaultLMSOwnershipCapacities", "capacity") 
    .Add(Restrictions.Eq("capacity.elements", OwnershipCapacity.VehicleFinance)) 
    .SetProjection(Projections.Id()) 
    .List<Guid>(); 

에서 그래서 ... 을 잘못 별칭을 집어 그것은

SELECT this_.Id as y0_ 
FROM intranet.sfEmployeeIntranetSettings this_ 
inner join contact.sfEmployeeDefaultLMSOwnershipCapacities defaultlms3_ on this_.Id=defaultlms3_.EmployeeId 
WHERE capacity1_.Capacity = @p0 

을 생성 - 용량에 대한 별칭이 다릅니다.

따라서 DDD에 맞지 않을지라도 ValueType Entity에 대한 제안은 두 번째입니다.그리고 (적어도 나를 위해) 현재의 아키텍처 작업 솔루션으로 : 여기에 관심을

CurrentSession.CreateCriteria<Employee>("employee") 
    .Add(Expression.Sql(
     "Exists (select top 1 null from contact.sfEmployeeDefaultLMSOwnershipCapacities dc where dc.EmployeeId = {alias}.Id and dc.Capacity = ?)", 
     "'" + OwnershipCapacity.VehicleFinance + "'", 
     NHibernateUtil.String)) 
    .SetProjection(Projections.Id()) 
    .List<Guid>(); 

몇몇 점 :

  • {alias} 내 경우 루트 개체 별칭 (직원)으로 이어질 것입니다. 불행히도 다른 별칭을 사용할 수는 없습니다.
  • (SQL 쿼리의 경우) value을 사용했습니다. ?을 대신 할 것이지만, 문자열이기 때문에 나는 "'"을 사용하여 이스케이프해야했습니다.