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 句を使用したクエリになります。むしろ、論理和で定義された制限が OUTER LEFT JOIN ... ON ... ステートメントの一部である可能性がある SQL クエリをレンダリングできることがわかります。

于 2011-03-30T14:32:22.737 に答える