2011-01-02 9 views
3

Ich möchte meine Anwendung aktualisieren, um NHiberante 3 anstelle von NHibernate 2.1.2 zu verwenden, sah sich jedoch einigen Problemen mit dem neuen LINQ-Anbieter gegenüber. Diese Frage bezieht sich auf eine von ihnen. Es sei angenommen, dass ich eine folgende Hierarchie von Klassen haben:NHibernate 3 LINQ: Wie kann ich IQueryable filtern, um nur Objekte der Klasse T und ihrer Unterklassen auszuwählen?

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; } 
} 

Ich benutze Fluent NHibernate diese Klassen in der Datenbank abzubilden:

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); 
      }); 
     } 
} 

Und dann will ich alle Seiten abfragen und eine Filterung tun:

NHibernate 3.0.0 schlägt in diesem Fall mit der NotSupported-Ausnahme fehl, aber es gibt Bugfix NH-2375 in der Entwicklungsversion von NH, die diesen Code zum Funktionieren führt. Leider filtert die OfType() -Methode die Objekte nach dem exakten Typ und wählt nur Objekte der ArticlePageData-Klasse aus. Der alte Linq to NH Provider wählt ArticlePageData und ExtendedArticlePageData in demselben Fall aus. Wie kann ich eine solche Filterung (wählen Sie nur Objekte der Klasse T und seiner Unterklassen) mit dem neuen Linq to NH-Provider?

+0

Welche Version des Linq-Anbieters haben Sie? Ich habe NH3.0 (NHibernate-3.0.0.GA-bin) heruntergeladen, kann aber keinen neuen Provider als die Version 2.1.2 finden. Vielen Dank. – alphadogg

+0

Seit Version 3.0.0 ist linq provider ein Teil von NHibernate. Sie müssen nichts anderes außer NHibernate selbst herunterladen. Das gesamte linq-Zeug befindet sich im NHibernate.Linq-Namespace. –

Antwort

0

können Sie

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

verwenden und für NHibernate 3.0.1 warten. oder vielleicht können Sie

 
session.Query<ArticlePageData>() 

statt

 
session.Query<PageData>() 
+6

Der erste ist eine schreckliche Idee: es lädt *** alles *** in Erinnerung. –

+0

Sicher kann ich In-Memory-Filterung, aber es ist eine schlechte Idee in Bezug auf die Leistung. –

+0

Will OfType () Methode arbeiten, wie es in NH 3.0.1 sollte? Ich kann keine Informationen darüber finden. –

2

session.Query<T>().OfType<SubT>() macht wenig Sinn verwenden, und es wird nicht auf Eigenschaften der Unterklasse filtern lassen. Verwenden Sie stattdessen session.Query<SubT>().

+0

Sicher, aber ich kann Abfrage nicht ohne eine große Menge von Änderungen in meiner Anwendung verwenden, deshalb habe ich diese Frage gestellt. Ich frage mich, ob eine Art zu tun OfType () Filterung mit dem vorhandenen IQueryable existiert. –

+0

Sie müssen die Änderungen vornehmen, weil dies nicht möglich ist. –

+0

@DiegoMijelshon Gibt es einen Fehler, der dieses Problem beschreibt? – AlexDev