我是NHibernate的新手,我很难找到使用NHibernate的Criteria引擎表示一些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; }
}
您可以从类中推断出基础表的外观,并且所有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));
我收到错误消息“无法解析属性:TestProject.Domain.UserAssignment的User.Company.Id。”
有人可以帮忙吗?
答案 0 :(得分:1)
使用条件时,无法使用表达式进行导航。您需要明确指定别名:
.CreateAlias("User", "User")
.Add(Expression.Eq("User.Company", requestingUser.Company));
答案 1 :(得分:0)
我最终不得不使用这样的子查询:
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。
约什