Я хочу обновить свое приложение, чтобы использовать NHiberante 3 вместо NHibernate 2.1.2, но столкнулось с некоторыми проблемами с новым поставщиком LINQ. Этот вопрос об одном из них. Предположим, что у меня есть следующая иерархия классов:
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; }
}
Я использую Fluent 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);
});
}
}
А затем я хочу запросить все страницы и выполнить некоторую фильтрацию:
IQueryable<PageData> pages = session.Query<PageData>();
...
var articles = pages.OfType<ArticlePageData>().Where(x => x.PublishedDate >= (DateTime.Now - TimeSpan.FromDays(7))).ToList();
В этом случае происходит сбой NHibernate 3.0.0 с исключением NotSupported, но в развивающейся версии NH есть исправление NH-2375, которое приводит этот код к работе. Но, к сожалению, метод OfType () фильтрует объекты по точному типу и выбирает только объекты класса ArticlePageData. Старый поставщик Linq to NH выбирает ArticlePageData и ExtendedArticlePageData в одном и том же случае.
Как я могу выполнить такую фильтрацию (выбрать только объекты класса T и его подклассов) с новым поставщиком Linq to NH?