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));

因为我已经有了用户公司列表,所以这不会给我带来性能问题。