Критерии API и левое соединение по словарю / карте - PullRequest
2 голосов
/ 30 марта 2011

У меня есть следующие классы:

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

Но я не знаю, как выполнить левое соединение с API-интерфейсом критериев nhibernate.Особенно с использованием выбора языка по умолчанию.

Любая помощь очень ценится.

1 Ответ

3 голосов
/ 30 марта 2011

Я нашел решение:

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 ....

...