我想升级我的应用程序以使用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类及其子类的对象)?
答案 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>()