Criteria API并在字典/地图上左连接

时间:2011-03-30 11:57:29

标签: nhibernate criteria-api nhibernate-criteria

我有以下课程:

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执行左连接。特别是使用默认语言选择。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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 ...语句的一部分。

相关问题