NHibernate 3 LINQ: how to filter IQueryable to select only objects of class T and its subclasses?

I want to update my application to use NHbelante 3 instead of NHibernate 2.1.2, but I ran into some problems with the new LINQ provider. This question concerns one of them. Suppose I have the following class hierarchy:

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

I use Fluent NHibernate to map these classes to the database:

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

And then I want to query all pages and do some filtering:

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-2375 NH, . , , OfType() ArticlePageData. Linq to NH ArticlePageData ExtendedArticlePageData . ​​ ( T ) Linq to NH?

+3
2

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>()
0

session.Query<T>().OfType<SubT>() , . session.Query<SubT>().

+2

Source: https://habr.com/ru/post/1783109/


All Articles