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