首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate -左联接

NHibernate -左联接
EN

Stack Overflow用户
提问于 2012-02-15 12:31:24
回答 2查看 16.5K关注 0票数 8

我有以下两张表:

Jobs AreaID,JobNo (组合键)

记录 LogID,AreaID,JobNo

我需要得到所有没有日志的作业。在SQL中,我可以做到:

代码语言:javascript
复制
SELECT Jobs.AreaID,
       Jobs.JobNo
FROM   Jobs
       LEFT JOIN Logs
           ON Jobs.AreaID = Logs.AreaID
           AND Jobs.JobNo = Logs.JobNo
WHERE  Logs.LogID is null

但是我不知道如何用NHibernate来完成这个任务。有人能给我指点吗?

以下是我的映射:

代码语言:javascript
复制
<class name="Job" table="Jobs">
    <composite-key name="Id">
        <key-property name="JobNo"/>
        <key-many-to-one name="Area" class="Area" column="AreaID"/>
    </composite-key>
</class>

<class name="Log" table="Logs">
    <id name="Id" column="LogID">
        <generator class="identity"/>
    </id>
    <property name="JobNo"/>
    <many-to-one name="Area" class="Area" column="AreaID"/>
</class>

谢谢

更新

好的,我稍微修改了Nosila的答案,现在做我想做的事情:

代码语言:javascript
复制
Log logs = null;

return session.QueryOver<Job>()
    .Left.JoinAlias(x => x.Logs, () => logs)
    .Where(x => logs.Id == null)
    .List<Job>();

我还必须将此添加到我的职务映射中:

代码语言:javascript
复制
<bag name="Logs">
    <key>
        <column name="JobNo"></column>
        <column name="DivisionID"></column>
    </key>
    <one-to-many class="Log"/>
</bag>

谢谢你的帮助。:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-15 12:56:27

我不熟悉复合标识符,因为我不使用它们,所以我知道NHibernate会自动创建正确的左联接。尽管如此,下面的(未经测试的)查询应该会让您开始。

代码语言:javascript
复制
Job jobAlias = null;
Log logAlias = null;
YourDto yourDto = null;

session.QueryOver<Job>()
    // Here is where we set what columns we want to project (e.g. select)
    .SelectList(x => x
        .Select(x => x.AreaID).WithAlias(() => jobAlias.AreaID)
        .Select(x => x.JobNo).WithAlias(() => jobAlias.JobNo)
    )
    .Left.JoinAlias(x => x.Logs, () => logAlias, x.JobNo == logAlias.JobNo)
    .Where(() => logAlias.LogID == null)
    // This is where NHibernate will transform what you have in your `SelectList()` to a list of objects
    .TransformUsing(Transformers.AliasToBean<YourDto>())
    .List<YourDto>();

public class YourDto
{
    public int AreaID { get; set; }
    public int JobNo { get; set; }
}

注意:您需要NHibernate 3.2来设置连接条件。

票数 8
EN

Stack Overflow用户

发布于 2012-02-15 13:02:45

代码语言:javascript
复制
Job job = null;
var jobsWithoutLogs = session.QueryOver(() => job)
    .WithSubquery.WhereNotExists(QueryOver.Of<Log>()
        .Where(log => log.Job == job)
        .Select(Projections.Id()))
    .List()

更新:我看到您添加了映射。以上代码仅适用于下列映射

代码语言:javascript
复制
<class name="Log" table="Logs">
    <id name="Id" column="LogID">
        <generator class="identity"/>
    </id>
    <many-to-one name="Job" >
      <column name="JobNo"/>
      <column name="AreaID"/>
    <many-to-one />
</class>
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9293424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档