2

我有以下课程:

public class Item
{
    public int Id { get; set; }
    public IDictionary<int, ItemLocal> { get; protected set; }
    public ICollection<string> Tags { get; set; }
    public int DefaultLanguageId { get; set; }
    public DateTime Start { get; set; }
}

public class ItemLocal
{
    public virtual Item Parent { get; set; }
    public virtual int LanguageId { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
}

这些映射到表 Item、ItemTag 和 ItemLocal。我想通过条件 api 进行以下查询:

select
    i.Id,
    i.Start,
    l.Title
from
    Item i
    left join ItemLocal l on i.Id = l.ParentId and i.DefaultLangaugeId = l.LanguageId
order by
    l.Title,
    i.Id

但我不知道如何使用 nhibernate 标准 api 执行左连接。特别是使用默认语言选择。

非常感谢任何帮助。

4

1 回答 1

3

我找到了一个解决方案:

Session
   .CreateCriteria<Item>("i")
   .CreateCriteria("Localization", "l", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
      .Add(Restrictions.Disjunction()
         .Add(Restrictions.EqProperty("i.DefaultLanguageId", "l.LanguageId"))
         .Add(Restrictions.IsNull("l.LanguageId"))
      )
   .AddOrder(Order.Asc("l.Title"))
   .AddOrder(Order.Asc("w.Id"));

这似乎可行,但会导致带有解决方法 WHERE 子句的查询。宁愿看到它可以呈现一个 SQL 查询,其中在析取中定义的限制可能是 OUTER LEFT JOIN ... ON ... 语句的一部分。

于 2011-03-30T14:32:22.737 回答