NHibernate 2.1.2ではなくNHiberante 3を使用するようにアプリケーションをアップグレードしたいのですが、新しいLINQプロバイダにいくつかの問題がありました。この質問はそれらの一つについてです。私はクラスの次の階層を持っていると仮定します。NHibernate 3 LINQ:クラスTとそのサブクラスのオブジェクトだけを選択するためにIQueryableをフィルタリングする方法は?
public abstract class PageData
{
public int ID { get; set; }
public string Title { get; set; }
}
public class ArticlePageData : PageData
{
public DateTime PublishedDate { get; set; }
public string Body { get; set; }
}
public class ExtendedArticlePageData : ArticlePageData
{
public string Preamble { get; set; }
}
私は、データベースにこれらのクラスをマッピングするために流暢NHibernateはを使用します。
public class PageDataMap : ClassMap<PageData>
{
public PageDataMap()
{
Table("PageData");
Id(x => x.ID);
Map(x => x.Title);
DiscriminateSubClassesOnColumn("PageType");
}
}
public class ArticlePageDataMap : SubclassMap<ArticlePageData>
{
public ArticlePageDataMap()
{
Join("ArticlePageData", p =>
{
p.KeyColumn("ID");
p.Map(x => x.PublishedDate);
p.Map(x => x.Body);
});
}
}
public class ExtendedArticlePageDataMap : SubclassMap<ExtendedArticlePageData>
{
public ExtendedArticlePageDataMap()
{
Join("ExtendedArticlePageData", p =>
{
p.KeyColumn("ID");
p.Map(x => x.Preamble);
});
}
}
そして、私はすべてのページを照会し、いくつかのフィルタリングをしたい:
この場合、NHibernate 3.0.0はNotSupported例外で失敗しますが、このコードを動作させるNHの開発版にはバグ修正NH-2375があります。しかし、残念なことに、OfType()メソッドはオブジェクトを厳密な型でフィルタリングし、ArticlePageDataクラスのオブジェクトのみを選択します。古いLinq to NHプロバイダは、同じケースでArticlePageDataとExtendedArticlePageDataを選択します。 新しいLinq to NHプロバイダでこのようなフィルタリング(クラスTおよびそのサブクラスのオブジェクトのみを選択)を行うにはどうすればよいですか?
あなたはどのバージョンのLinqプロバイダをお持ちですか?私はNH3.0(NHibernate-3.0.0.GA-bin)をアンロードしましたが、2.1.2バージョンより新しいプロバイダを見つけることはできません。ありがとう。 – alphadogg
バージョン3.0.0以来、linqプロバイダはNHibernateの一部です。あなたはNHibernateそれ自身以外の何かをダウンロードする必要はありません。すべてのlinqのものはNHibernate.Linq名前空間にあります。 –