nHibernate Criteria 中的子查询
Subquery in Criteria of nHibernate
我需要一些子查询方面的帮助。
我的问题看起来很简单,但我想不通。
我有 3 个实体:
- 公司
- 汽车
- 员工
员工有公司列表(但公司没有员工列表)。
汽车一公司。
我需要从某些员工有权访问的每家公司检索所有汽车。
数据库结构以防有帮助。
公司
id | Name
员工
id | Name
CompanyToEmployee
employee_id | company_id
汽车
id | Name | company_id
正如 gmiley 所说,我正在添加一些莫拉信息。
到目前为止我做了什么:不多。
ICriteria consult = Session.CreateCriteria<Car>();
DetachedCriteria c = DetachedCriteria.For<Employee>()
.SetProjection(Projections.Property("Companies"))
.Add(Restrictions.Eq("Id", employee.Id));
consult.Add(Subqueries.PropertyIn("Company.Id", c));
但是returns是公司内所有同Id'employee'的车。我明白为什么。但我无法根据需要更改它。
哑数据澄清:
有 2 名员工:"Bill Gates" e "Steve Jobs.
比尔·盖茨为 Google 和微软工作。
史蒂夫乔布斯为 Google 和 Apple 工作。
Google 有 2 辆车:"Car 1" 和 "Car 2"。
Microsoft 有 1 辆车:"Car 3"
Apple 有 3 辆车:"Car 4"、"Car 5" 和 "Car 6"。
我需要的:
比尔盖茨工作的所有公司的所有汽车。
在这种情况下,汽车:"Car 1"、"Car 2" 和 "Car 3"。
提前致谢!
这一行:
.SetProjection(Projections.Property("Companies"))
您在投影中有一整套公司。我不知道这实际上运行时没有语法错误。但是,我不知道它到底做了什么,也不会依赖它。
也许,使用别名也会让事情变得更清楚。试试这个:
var cars = Session.CreateCriteria<Car>("c");
var c = DetachedCriteria.For<Employee>("emp")
// join
.CreateCriteria("emp.Company", "comp")
// select company id
.SetProjection(Projections.Property("comp.id"))
// of all companies where the employee is working in.
.Add(Restrictions.Eq("emp.Id", employee.Id));
carCompanies.Add(Subqueries.PropertyIn("comp.Id", c));
我设法以一种非常简单的方式解决了我的问题:
foreach (var company in user.Companies)
{
companies.Add(company.Id);
}
consult.Add(Expression.In("Company.Id", companies));
因为我已经有了用户公司列表,所以这不会给我带来性能问题。
我需要一些子查询方面的帮助。 我的问题看起来很简单,但我想不通。
我有 3 个实体: - 公司 - 汽车 - 员工
员工有公司列表(但公司没有员工列表)。 汽车一公司。
我需要从某些员工有权访问的每家公司检索所有汽车。
数据库结构以防有帮助。
公司
id | Name
员工
id | Name
CompanyToEmployee
employee_id | company_id
汽车
id | Name | company_id
正如 gmiley 所说,我正在添加一些莫拉信息。
到目前为止我做了什么:不多。
ICriteria consult = Session.CreateCriteria<Car>();
DetachedCriteria c = DetachedCriteria.For<Employee>()
.SetProjection(Projections.Property("Companies"))
.Add(Restrictions.Eq("Id", employee.Id));
consult.Add(Subqueries.PropertyIn("Company.Id", c));
但是returns是公司内所有同Id'employee'的车。我明白为什么。但我无法根据需要更改它。
哑数据澄清:
有 2 名员工:"Bill Gates" e "Steve Jobs.
比尔·盖茨为 Google 和微软工作。
史蒂夫乔布斯为 Google 和 Apple 工作。
Google 有 2 辆车:"Car 1" 和 "Car 2"。
Microsoft 有 1 辆车:"Car 3"
Apple 有 3 辆车:"Car 4"、"Car 5" 和 "Car 6"。
我需要的: 比尔盖茨工作的所有公司的所有汽车。
在这种情况下,汽车:"Car 1"、"Car 2" 和 "Car 3"。
提前致谢!
这一行:
.SetProjection(Projections.Property("Companies"))
您在投影中有一整套公司。我不知道这实际上运行时没有语法错误。但是,我不知道它到底做了什么,也不会依赖它。
也许,使用别名也会让事情变得更清楚。试试这个:
var cars = Session.CreateCriteria<Car>("c");
var c = DetachedCriteria.For<Employee>("emp")
// join
.CreateCriteria("emp.Company", "comp")
// select company id
.SetProjection(Projections.Property("comp.id"))
// of all companies where the employee is working in.
.Add(Restrictions.Eq("emp.Id", employee.Id));
carCompanies.Add(Subqueries.PropertyIn("comp.Id", c));
我设法以一种非常简单的方式解决了我的问题:
foreach (var company in user.Companies)
{
companies.Add(company.Id);
}
consult.Add(Expression.In("Company.Id", companies));
因为我已经有了用户公司列表,所以这不会给我带来性能问题。