nHibernate标准中的子查询

时间:2016-06-24 21:10:01

标签: c# nhibernate subquery nhibernate-criteria

我需要一些子查询的帮助。 我的问题似乎很容易,但我无法理解。

我有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”。

提前谢谢!

2 个答案:

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

由于我已经有用户公司列表,这不会给我带来性能问题。