Нужна помощь по API NHibernate Criteria, пожалуйста - PullRequest
1 голос
/ 29 июня 2011

Я пытаюсь создать запрос критерия, который захватывает «RejectedRecords» с помощью useruploaded, которые не помечены как удаленные или объект в RejectedRecord находится в списке объектов, которым назначен пользователь (user.UserFacilities). У меня первая часть работает нормально (по пользователю и не удалено), но я не уверен, как добавить предложение OR, чтобы получать записи, которые находятся в наборе пользовательских средств. В SQL это будет выглядеть так:

SELECT * 

FROM RejectedRecords

WHERE (UserUploaded = 1 AND IsDeleted = 0) 
OR FacilityId IN (SELECT FacilityId FROM UserFacility WHERE UserId = 1)

Вот моя попытка в C # (Не уверен, как выполнить подзапрос):

    public IList<RejectedRecord> GetRejectedRecordsByUser(User u)
    {
        return base._session.CreateCriteria(typeof(RejectedRecord))
            .Add(
                    (
                        Expression.Eq(RejectedRecord.MappingNames.UserUploaded, u)
                        && Expression.Eq(RejectedRecord.MappingNames.IsDeleted, false)

                    )
            )
            .List<RejectedRecord>();
    }

1 Ответ

3 голосов
/ 30 июня 2011

Ключ должен использовать Разъединение и соединение в сочетании с подзапросом.

var facilityIdQuery = DetachedCriteria.For<UserFacility>()
   .Add(Expression.Eq("User.Id", u))
   .SetProjection(Projections.Property("Facility.Id"));

var results = session.CreateCriteria<RejectedRecords>()
    .Add(
        Restrictions.Disjunction()
        .Add(
            Restrictions.And(
              Restrictions.Eq(RejectedRecord.MappingNames.UserUploaded, u),
              Restrictions.Eq(RejectedRecord.MappingNames.IsDeleted, false)
            )
        )
        .Add(Subqueries.PropertyIn("FacilityId",facilityIdQuery))
    ).List();
...