【问题标题】:Subquery in Criteria of nHibernatenHibernate Criteria 中的子查询
【发布时间】:2016-06-24 21:10:00
【问题描述】:

我需要一些关于子查询的帮助。 我的问题看起来很简单,但我想不通。

我有 3 个实体: - 公司 - 汽车 - 员工

员工有一个公司列表(但公司没有员工列表)。 汽车有一家公司。

我需要从某个员工可以访问的每家公司取回所有汽车。

数据库结构以防万一。

公司

id   |     Name     

员工

id   |     Name    

公司对员工

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 'employee' 的所有汽车。我明白为什么。但我无法根据自己的需要更改它。

需要澄清的愚蠢数据:

有 2 名员工:“比尔·盖茨”和“史蒂夫·乔布斯”。

比尔盖茨为谷歌和微软工作。

史蒂夫乔布斯为谷歌和苹果工作。

Google 有 2 辆车:“Car 1”和“Car 2”。

微软有 1 辆车:“Car 3”

Apple 有 3 辆汽车:“Car 4”、“Car 5”和“Car 6”。

我需要什么: 比尔盖茨工作的所有公司的所有汽车。

在这种情况下,汽车:“汽车 1”、“汽车 2”和“汽车 3”。

提前谢谢你!

【问题讨论】:

  • 如果可以,请提供一些示例数据、您想要的结果示例,最重要的是,提供您迄今为止尝试过的一些代码,以便我们知道您已经完成了多长时间它(当人们看到你付出了一些努力时,它在获得帮助方面也有很长的路要走,并不是说你没有,只是表明你有很好)。即使您知道代码完全错误,它也有助于我们了解您的想法。
  • 这是作业吗?数据库设计有点奇怪。然而,在此之上总是有可能有一个更好的类设计。无需为此查询进行任何更改,但它会使生活变得更加轻松。
  • 这是一个真实案例场景,以非常简单的方式暴露出来。聚焦问题。

标签: c# nhibernate subquery nhibernate-criteria


【解决方案1】:

在这一行:

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

【讨论】:

  • 员工没有“公司”。它有一个公司列表。
【解决方案2】:

我设法以一种非常简单的方式解决了我的问题:

        foreach (var company in user.Companies)
        {
            companies.Add(company.Id);
        }

        consult.Add(Expression.In("Company.Id", companies));

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-26
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    相关资源
    最近更新 更多