如何在属性和多对多的NHibernate中添加OR查询?

时间:2009-07-29 14:11:07

标签: c# nhibernate

我有一个Document类,它有一个User Property,它是拥有该文档的User,但我也有一个User List。有权访问该文档的用户。我正在尝试创建一个查询,该查询将返回我拥有或可以访问的文档。

IList<Document> results = UnitOfWork.CurrentSession.CreateCriteria(typeof(Document))
                .CreateCriteria("Owner")
                .CreateCriteria("UserList")
                .Add(nh.Criterion.Restrictions.IdEq(obj.Id))
                .SetFirstResult(pageSize * page)
                .SetMaxResults(pageSize)
                .List<Document>();

以上是我到目前为止所尝试但无济于事的内容。 Document类的结构缩短为:

public class Document : DomainObject<Document>{
     public Document(){
          UserList = new List<User>();
     }
     public virtual User Owner{get;set;}
     public virtual IList<User> UserList{get;set;}
}

我感谢任何关于此的指导!!

Cheeers,

安德鲁

示例SQL我正在寻找

declare @UserID uniqueidentifier

set @UserID = '37f7a55f-84c9-461b-a5b2-b412fe96932b'

select * from [Document] s
where s.UserID = @UserID
or exists(select * from DocumentUser su where su.userid = @UserID)

2 个答案:

答案 0 :(得分:1)

请您发布可以返回您想要的SQL吗? 。

我认为那里有一个子查询 - 在这种情况下,一个独立的标准可能会有所帮助。然后将其添加到ICriteria,如:Add(Subqueries ....)

答案 1 :(得分:1)

我做到了!

感谢您的帮助!你最后发表评论并向我询问sql让我再次看清楚:这是解决方案:

    var detached = DetachedCriteria.For<Document>()
        .CreateCriteria("UserList")
        .SetProjection(Projections.Id())
        .Add(Restrictions.IdEq(obj.Id));

    IList<Document> results = UnitOfWork.CurrentSession.CreateCriteria(typeof(Document),"s")
        .CreateAlias("s.User","u")
        .Add(Restrictions.Or(Restrictions.Eq("u.Id", obj.Id), Subqueries.Exists(detached)))
        .SetFirstResult(pageSize * page)
        .SetMaxResults(pageSize)
        .List<Document>();