NHibernate 3 LINQ:如何过滤IQueryable以仅选择类T及其子类的对象?

时间:2011-01-02 15:42:35

标签: nhibernate linq-to-nhibernate

我想升级我的应用程序以使用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的开发版本中存在bug修复NH-2375,导致此代码正常工作。但是,不幸的是,OfType()方法按精确类型过滤对象,只选择ArticlePageData类的对象。旧的Linq to NH提供程序在相同的情况下选择ArticlePageData和ExtendedArticlePageData。 如何使用新的Linq to NH提供程序进行此类过滤(仅选择T类及其子类的对象)?

2 个答案:

答案 0 :(得分:2)

session.Query<T>().OfType<SubT>()没什么意义,它不会让你过滤子类的属性。请改用session.Query<SubT>()

答案 1 :(得分: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>()