我需要一些子查询的帮助。 我的问题似乎很容易,但我无法理解。
我有3个实体: - 公司 - 汽车 - 员工
员工有公司名单(但公司没有员工名单)。 汽车有一家公司。
我需要从员工有权访问的每家公司检索所有汽车。
数据库结构以防万一。
公司
id | Name
员工
id | Name
CompanyToEmployee
employee_id | company_id
汽车
id | Name | company_id
随着gmiley的消化,我正在添加一些mora信息。
到目前为止我做了什么:不多。
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));
但它返回的是公司内所有具有相同Id'员工'的汽车。我明白为什么。但是我无法根据自己的需要改变它。
愚蠢的数据澄清:
有2名员工:“比尔盖茨”和“史蒂夫乔布斯。”
比尔盖茨为谷歌和微软工作。
史蒂夫·乔布斯为谷歌和苹果工作。
谷歌拥有2辆汽车:“汽车1”和“汽车2”。 微软有一辆车:“Car 3” Apple拥有3辆汽车:“Car 4”,“Car 5”和“Car 6”。我需要什么: 比尔盖茨为所有公司工作的所有汽车。
在这种情况下,汽车:“汽车1”,“汽车2”和“汽车3”。
提前谢谢!
答案 0 :(得分:0)
在这一行:
.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));
答案 1 :(得分:0)
我设法以一种非常简单的方式解决我的问题:
foreach (var company in user.Companies)
{
companies.Add(company.Id);
}
consult.Add(Expression.In("Company.Id", companies));
由于我已经有用户公司列表,这不会给我带来性能问题。