【问题标题】:NHibernate QueryOver with leftjoinsNHibernate QueryOver 与 leftjoins
【发布时间】:2014-03-25 10:27:09
【问题描述】:

这件事让我忙了好几天,我希望 NHibernate 大师能帮助我。我已经设置了一个在 SQL Server 中工作的查询,我想在 NHibernate 中得到同样的结果。但到目前为止,我所有的尝试(在 stackoverflow 中进行了大量的谷歌搜索和浏览)都失败了。这是查询:

Select
  j.id,
  j.title,
  j.company,
  jt.name as category,
  loc.city,
  je.is_assigned,
FROM job j
  LEFT JOIN location loc ON loc.id = j.location
  LEFT JOIN job_tag jt ON jt.job = j.id
    and jt.name in (SELECT name FROM tag WHERE tag_category=''Jobtype'')
  LEFT JOIN job_employee je ON je.job = j.id
    and je.employee_uid = <string>

我更喜欢使用 QueryOver,但很高兴得到你们的建议!

编辑:到目前为止我所做的非常简单......

JobEmployee jobEmployee = null;
Location loc = null;
JobTag jobTag = null;

session.QueryOver<Job>()
  .JoinAlias(x => x.location, () => loc)
  .JoinAlias(x => x.tags, () => jobTag, JoinType.LeftOuterJoin,
     Restrictions.On(jobTag.name).IsIn(<subquery>))
  .List();

但也有类似“delegate .... does not take 1 arguments”之类的错误。

最好的问候, 马丁

【问题讨论】:

  • 看,这个场景的语法查询在nhforge.org/doc/nh/en/index.html#queryqueryover 有很好的描述。如果你能做点什么就好了。基本的 JOIN、SELECT、WHERE - 显示你有什么,并描述什么不起作用……如果有的话。 NHibernate 经验丰富的人为您提供帮助会更容易。
  • 我对基本的 NHibernate 使用没有任何问题。我知道如何设置选择、where 子句等。但我不知道如何将条件设置为左连接。希望这对您有意义。
  • 干得好。更多错误会有所帮助,但让我检查一下。或者也许其他人会给出答案......

标签: sql nhibernate fluent-nhibernate nhibernate-criteria queryover


【解决方案1】:

这是解决方案的草稿...首先是子查询:

var subquery = QueryOver
    .Of<Tag>()
    .Where(t => t.TagCategory == "Jobtype")
    .Select(t => t.Name);

现在,我们将使用withClause 中的子查询:

JobEmployee jobEmployee = null;
Location loc = null;
JobTag jobTag = null;

var list = session
  .QueryOver<Job>()
  .JoinAlias(x => x.location, () => loc)
  .JoinAlias(x => x.tags, () => jobTag, JoinType.LeftOuterJoin,

  // instead of this
  // Restrictions.On(jobTag.name).IsIn(<subquery>))

  // use this
    Subqueries.WhereProperty(() => jobTag.name).In(subquery)
  )
  .List();

因此,我们使用 withClauseSubqueries

过滤了 JOIN

【讨论】:

  • 感谢子查询,这引导我走向正确的方向。但是,当我尝试向第一个 JoinAlias 添加另一个条件时,例如 'JoinAlias(x => x.location, () => loc, Restrictions.Equals(loc.name,""))',编译器会告诉我认为 x => x.location 的“代表....不接受 1 个参数”。没有标准,它就像魅力一样工作:-/有什么建议吗?
  • 试试.JoinAlias(x =&gt; x.location, () =&gt; loc, JoinType.LeftOuterJoin, Restrictions.Eq("name", "&lt;myplace&gt;"))。那应该是正确的翻译
  • 太棒了!!!我昨天整个晚上都在挖掘,以找到更好地解释这个主题的文档/示例。到目前为止还没有成功......你有没有机会解释我的方法为什么失败?为什么 Criterion 需要表达式而不是 bool Restrictions.Equals?
  • 嗯 ;) 我不知道如何回答“为什么” ;) 但幸运的是,我们确实为您提供了“如何”的答案...享受 NHibernate。这是一个了不起的工具。真的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多