2013-11-21 32 views
1

我试图查询包含任何指定的categoryID的对象。如果我只使用我的一个分解,我会得到正确的结果,但不是当我将它们合并时。C#查询任何在IList中的NHibernate

我想要所有具有CategoryID 1或2或3和CategoryID 5的对象。有什么建议吗?

'Test'的映射:HasMany(x => x.Categories).KeyColumn(“PageVersion”)。ExtraLazyLoad();

public class Test 
{ 
    public virtual IList<PageCategory> Categories { get; set; } 
} 

public class PageCategory 
{ 
    public virtual int ID { get; set; } 
    public virtual int CategoryID { get; set; } 
    public virtual int PageVersion { get; set; } 
} 


    public static Test Query() 
    { 
     var query = NHibernateHelper.OpenSession().CreateCriteria<Test>(); 
     query.CreateAlias("Categories", "Categories", NHibernate.SqlCommand.JoinType.InnerJoin); 

     Junction disjunction = Restrictions.Disjunction(); 
     disjunction.Add(Restrictions.In("Categories.CategoryID", new List<int> { 1, 2, 3})); 
     query.Add(disjunction); 

     Junction disjunction2 = Restrictions.Disjunction(); 
     disjunction2.Add(Restrictions.In("Categories.CategoryID", new List<int> { 5 })); 
     query.Add(disjunction2); 

    } 
+0

你应该添加你的两个'Restrictions.In'相同的脱节,而不是创建两个单独的分离。 – jbl

+0

然后我得到ID为1,2,3,5的所有结果。我想为每个复选框列表我使用,这意味着项目应该包含1,2,3或5 – Tobbe

+0

你可以显示你想要生成的SQL?这将使标准变得更容易。 –

回答

0

假设你PageCategory具有参考回到Test

public virtual Test TestObject { get; set; } 

和你Test类有一个ID财产

public virtual int ID { get; set; } 

,你可以尝试:

public DetachedCriteria GetDetachedCriteria(List<int> ids) 
{ 
    return DetachedCriteria 
      .For<PageCategory>() 
      .SetProjection(Projections.ProjectionList().Add(Projections.Property("ID"))) 
      .Add(Restrictions.In("CategoryID", ids)) 
      .Add(Restrictions.EqProperty("TestObject", "test.ID")); 
} 

然后

var pocos = session.CreateCriteria(typeof(Test),"test") 
    .Add(Subqueries.Exists(GetDetachedCriteria(new List<int> { 1, 2, 3 }))) 
    .Add(Subqueries.Exists(GetDetachedCriteria(new List<int> { 5 }))) 
    .List<Test>(); 

以前的答案 ------------------------------

不知道重复CreateAlias会工作,但也许你可以尝试这样的事:

var query = NHibernateHelper.OpenSession().CreateCriteria<Test>(); 
    query.CreateAlias("Categories", "cat1", NHibernate.SqlCommand.JoinType.InnerJoin); 
    query.CreateAlias("Categories", "cat2", NHibernate.SqlCommand.JoinType.InnerJoin); 
    query.Add(Restrictions.In("cat1.CategoryID", new List<int> { 1, 2, 3})); 
    query.Add(Restrictions.In("cat2.CategoryID", new List<int> { 5 })); 

希望这将有助于

+0

然后我得到以下错误:“重复的关联路径:类别 具有相同的密钥项目已被添加。” – Tobbe

+0

@ user3017411 ok,thx。编辑我的答案 – jbl

+1

这项工作,非常感谢! – Tobbe