我有以下课程:
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执行左连接。特别是使用默认语言选择。
非常感谢任何帮助。
答案 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 ...语句的一部分。