2010-05-06 3 views
1

목록의 내용을 기반으로 결과 집합을 쿼리하고 싶습니다. 클래스 Foo의 단일 인스턴스에 대해이 작업을 수행했지만 IList<Foo>에 대해이 작업을 수행하는 방법을 잘 모르겠습니다.여러 값에 대해 쿼리하기 위해 nHibernate에서 기준을 설정하는 방법

 public ICriteria CreateCriteria(Foo foo) 
     { 
      return session 
       .CreateCriteria<Component>() 
       .CreateCriteria("Versions") 
       .CreateCriteria("PublishedEvents") 
       .Add(Restrictions.And(Restrictions.InsensitiveLike("Name", foo.Name, MatchMode.Anywhere), 
             Restrictions.InsensitiveLike("Type", foo.Type, MatchMode.Anywhere))) 
       .SetCacheable(true); 
     } 

을하지만 방법 매개 변수가 Foo의 목록입니다 때 이걸 어떻게해야합니까 : 클래스 Foo의 단일 인스턴스에 대한

그래서

이 작동?

public ICriteria CreateCriteria(IList<Foo> foos) 
    { 
     return session 
      .CreateCriteria<Component>() 
      .CreateCriteria("Versions") 
      .CreateCriteria("PublishedEvents") 
      .Add(Restrictions.And(Restrictions.InsensitiveLike("Name", foo.Name, MatchMode.Anywhere), 
            Restrictions.InsensitiveLike("Type", foo.Type, MatchMode.Anywhere))) 
      .SetCacheable(true); 
    } 

답변

1

이 쿼리로 수행하려는 작업에 대해 생각하고 있다면 실제로 사용중인 구문에서 쿼리하는 것이 실제로 의미가 없습니다. 실제로 사용할 수있는 유일한 옵션은 다음과 같이 루프를 통해 동적으로 기준을 생성하는 것입니다.

public ICriteria CreateCriteria(IList<Foo> foos) 
    { 
     var criteria = session 
      .CreateCriteria<Component>() 
      .CreateCriteria("Versions") 
      .CreateCriteria("PublishedEvents") 
      .SetCacheable(true); 

     foreach(var foo in foos) 
     { 
      criteria.Add(Restrictions.And(Restrictions.InsensitiveLike("Name", foo.Name, MatchMode.Anywhere),Restrictions.InsensitiveLike("Type", foo.Type, MatchMode.Anywhere))); 
     } 
     return criteria; 
    } 
+0

이런 종류의 작업을 수행하는 더 좋은 방법은 무엇입니까? – AwkwardCoder

+0

유일한 대안은 Restrictions.In()을 사용하여 컬렉션을 전달하는 것이지만 InsensitiveLike를 수행하고 있으므로 각 쿼리를 추가해야합니다. 이 요청을하기 위해 필요한 실제 SQL을 작성하면 위의 방법이 완벽합니다. – lomaxx

관련 문제