2011-01-02 4 views
3

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およびそのサブクラスのオブジェクトのみを選択)を行うにはどうすればよいですか?

+0

あなたはどのバージョンのLinqプロバイダをお持ちですか?私はNH3.0(NHibernate-3.0.0.GA-bin)をアンロードしましたが、2.1.2バージョンより新しいプロバイダを見つけることはできません。ありがとう。 – alphadogg

+0

バージョン3.0.0以来、linqプロバイダはNHibernateの一部です。あなたはNHibernateそれ自身以外の何かをダウンロードする必要はありません。すべてのlinqのものはNHibernate.Linq名前空間にあります。 –

答えて

0

あなたは

 
var articles = pages.AsEnumerable().OfType<ArticlePageData>().Where(x => x.PublishedDate >= (DateTime.Now - TimeSpan.FromDays(7))).ToList(); 

を使用して、NHibernateは3.0.1を待つことができます。 または多分あなたは

 
session.Query<ArticlePageData>() 

代わりの

 
session.Query<PageData>() 
+6

最初の1つは恐ろしいアイデアです:メモリに***すべての***をロードします。 –

+0

確かに、メモリ内のフィルタリングはできますが、パフォーマンス面では悪い考えです。 –

+0

OfForm ()メソッドはNH 3.0.1で動作するはずですか?私はそれについての情報を見つけることができません。 –

2

session.Query<T>().OfType<SubT>()ほとんど意味がない、そしてそれはあなたがサブクラスのプロパティにフィルタできませんを使用することができます。代わりにsession.Query<SubT>()を使用してください。

+0

確かに、私のアプリケーションで大きな変更なしでクエリを使用することはできません。そのため、この質問をしました。 OfType ()を既存のIQueryableでフィルタリングする何らかの方法があるかどうかは疑問です。が存在します。 –

+0

これは可能ではないので、変更を行う必要があります。 –

+0

@DiegoMijelshonこの問題を説明するバグはありますか? – AlexDev

関連する問題