Как мне создать этот запрос с помощью NHibernate Criteria - PullRequest
1 голос
/ 20 апреля 2011

Я новичок в NHibernate, и у меня возникают проблемы с поиском лучшего способа представления некоторого SQL-кода с помощью движка Cibereria NHibernate.Вот основное описание объектной модели:

public class Project : EntityBase<Project>
{
    // Properties for a project
    public virtual Company OwnerCompany { get; set; }
    public virtual IList<UserAssignment> UserAssignments { get; set; }
}

public class Company : EntityBase<Company>
{
    // Properties for a company
}

public class User : EntityBase<User>
{
    // Properties for a user
    public virtual Company Company { get; set; }
}

public class UserAssignment : EntityBase<UserAssignment>
{
    // Properties for an assignment
    public virtual User User { get; set; }
}

Из классов можно вывести, как выглядят базовые таблицы, и все элементы NH находятся в абстрактном классе EntityBase.

По сути, я хочу получить все проекты, принадлежащие определенной компании или имеющие UserAssignments для кого-то из этой компании. Вот как я могу сделать это в SQL:

select P.*
from Project P
where P.OwnerCompany_Id = @CompanyId
    or P.Id in (
        select Project_Id
        from UserAssignment UA
            join User U on UA.User_Id = U.Id
        where U.Company_Id = @CompanyId
    )

Я использую DetachedCriteria,и я даже не могу заставить его работать, просто сопоставляя пользователя UserAssignment с компанией, не говоря уже о назначениях и владельце.Когда я попробовал это:

var criteria = DetachedCriteria
                .For<Project>()
                .CreateCriteria("UserAssignments")
                    .Add(Expression.Eq("User.Company.Id", requestingUser.Company.Id));

я получаю сообщение об ошибке «Не удалось разрешить свойство: User.Company.Id TestProject.Domain.UserAssignment.»

Может кто-нибудь помочь?

Ответы [ 2 ]

1 голос
/ 20 апреля 2011

При использовании критериев вы не можете перемещаться с помощью выражения. Вам необходимо явно указать псевдоним:

.CreateAlias("User", "User")
.Add(Expression.Eq("User.Company", requestingUser.Company));
0 голосов
/ 26 апреля 2011

Мне пришлось использовать такой подзапрос, как этот:

var userSubquery = DetachedCriteria.For<UserAssignment>()
    .SetProjection(Projections.Property("Project")) // I had to put this reference property in the UserAssignment
    .CreateCriteria("User")
    .CreateCriteria("Company")
    .Add(Restrictions.Eq("Id", requestingUser.Company.Id));

var projectCriteria = DetachedCriteria.For<Project>()
    .Add(Restrictions.Or(
        Restrictions.Eq("OwnerCompany.Id", requestingUser.Company.Id),
        Subqueries.PropertyIn("Id", userSubquery)));

Я хотел избежать добавления свойства Project к объекту UserAssignment, поскольку этот объект может применяться к нескольким другим вещам, кромепроекты, но я не мог понять, как заставить объединение, используя критерии без него.Я не хотел использовать выражение SQL или HQL.

Джош

...