如何使用NHibernate条件创建此查询
我是NHibernate的新手,我很难找到使用NHibernate的标准引擎表示某些SQL的最佳方法。以下是对象模型的基本描述:如何使用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
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
乔希