如何使用NHibernate条件创建此查询

如何使用NHibernate条件创建此查询,nhibernate,nhibernate-criteria,Nhibernate,Nhibernate Criteria,我是NHibernate的新手,我很难找到使用NHibernate的标准引擎表示某些SQL的最佳方法。以下是对象模型的基本描述: public class Project : EntityBase<Project> { // Properties for a project public virtual Company OwnerCompany { get; set; } public virtual IList<UserAssignment> U

我是NHibernate的新手,我很难找到使用NHibernate的标准引擎表示某些SQL的最佳方法。以下是对象模型的基本描述:

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; }
}
我使用的是DetachedCriteria,我甚至无法让它工作,只是将UserAssignment的用户与公司匹配,更不用说分配和所有者了。当我尝试这样做时:

var criteria = DetachedCriteria
                .For<Project>()
                .CreateCriteria("UserAssignments")
                    .Add(Expression.Eq("User.Company.Id", requestingUser.Company.Id));
var-criteria=DetachedCriteria
.对于()
.CreateCriteria(“用户分配”)
.Add(Expression.Eq(“User.Company.Id”,requestingUser.Company.Id));
我收到一个错误,提示“无法解析TestProject.Domain.UserAssignment的属性:User.Company.Id。”


有人能帮忙吗?

使用条件时,您不能使用表达式导航。您需要明确指定别名:

.CreateAlias("User", "User")
.Add(Expression.Eq("User.Company", requestingUser.Company));

使用条件时,无法使用表达式进行导航。您需要明确指定别名:

.CreateAlias("User", "User")
.Add(Expression.Eq("User.Company", requestingUser.Company));

我最终不得不使用这样的子查询:

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)));
var userSubquery=DetachedCriteria.For()
.SetProjection(Projections.Property(“Project”)//我必须将这个引用属性放在UserAssignment中
.CreateCriteria(“用户”)
.CreateCriteria(“公司”)
.Add(Restrictions.Eq(“Id”,requestingUser.Company.Id));
var projectCriteria=DetachedCriteria.For()
.添加(限制)或(
Eq(“OwnerCompany.Id”,requestingUser.Company.Id),
PropertyIn(“Id”,userSubquery));
我想避免将
Project
属性添加到
UserAssignment
对象中,因为该对象可以应用于除项目之外的其他一些事情,但我不知道如何使用没有它的条件强制联接。我不想使用SQL表达式或HQL


Josh

我最后不得不使用这样的子查询:

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)));
var userSubquery=DetachedCriteria.For()
.SetProjection(Projections.Property(“Project”)//我必须将这个引用属性放在UserAssignment中
.CreateCriteria(“用户”)
.CreateCriteria(“公司”)
.Add(Restrictions.Eq(“Id”,requestingUser.Company.Id));
var projectCriteria=DetachedCriteria.For()
.添加(限制)或(
Eq(“OwnerCompany.Id”,requestingUser.Company.Id),
PropertyIn(“Id”,userSubquery));
我想避免将
Project
属性添加到
UserAssignment
对象中,因为该对象可以应用于除项目之外的其他一些事情,但我不知道如何使用没有它的条件强制联接。我不想使用SQL表达式或HQL

乔希