2010-05-06 35 views
1

我想根據列表的內容查詢一組結果,我已經設法爲類Foo的單個實例執行此操作,但我不確定我會怎麼做IList<Foo>如何在nHibernate中設置標準以查詢多個值

所以對於類Foo的單個實例,這個工程:

 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列表?

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 2010-05-06 10:43:04

+0

唯一的選擇是使用Restrictions.In()並傳入集合,但由於您正在執行InsensitiveLike,因此您需要追加每個查詢。如果你編寫實際的SQL你需要做出這個請求,上面的方法非常合理。 – lomaxx 2010-05-06 10:44:57