Как добавить запрос OR в NHibernate между свойством и многими ко многим? - PullRequest
0 голосов
/ 29 июля 2009

У меня есть класс Document, в котором есть свойство User, то есть пользователь, которому принадлежит документ, но также у меня есть список пользователей. Пользователи, которые имеют доступ к документу. Я пытаюсь создать запрос, который будет возвращать документы, которыми я владею или у меня есть доступ.

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

Andrew

ПРИМЕР 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 ]

1 голос
/ 29 июля 2009

Я сделал это!

Спасибо за вашу помощь! Последний комментарий, который вы сделали и спросил меня о 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>();
1 голос
/ 29 июля 2009

Можете ли вы опубликовать SQL, который вернул бы то, что вы хотите? ,

Я думаю, что там есть подзапрос - отдельные критерии могут помочь в этом случае. Затем добавьте его в ICriteria, например: Добавить (Подзапросы ....)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...