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

NHibernate 3 LINQ:如何过滤iQueryEnable以仅选择T类及其子类的对象?,nhibernate,linq-to-nhibernate,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 { pu

我想将我的应用程序升级为使用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);
            });
        }
}
公共类PageDataMap:ClassMap
{
公共页面数据映射()
{         
表(“页面数据”);
Id(x=>x.Id);
地图(x=>x.Title);
区分子类子列(“页面类型”);
}
}
公共类ArticlePageDataMap:子类映射
{
公共ArticlePageDataMap()
{                     
加入(“ArticlePageData”,p=>
{
p、 键列(“ID”);
p、 Map(x=>x.date);
p、 Map(x=>x.Body);
});
}
}
公共类ExtendedArticlePageDataMap:子类映射
{
公共ExtendedArticlePageDataMap()
{            
加入(“ExtendedArticlePageData”,p=>
{
p、 键列(“ID”);
p、 Map(x=>x.0);
});
}
}
然后我想查询所有页面并进行一些筛选:

IQueryable<PageData> pages = session.Query<PageData>();

...

var articles = pages.OfType<ArticlePageData>().Where(x => x.PublishedDate >= (DateTime.Now - TimeSpan.FromDays(7))).ToList();
IQueryable pages=session.Query();
...
var articles=pages.OfType()。其中(x=>x.PublishedDate>=(DateTime.Now-TimeSpan.FromDays(7)).ToList();
在本例中,NHibernate 3.0.0失败,出现NotSupported异常,但NH的开发版本中存在错误修复NH-2375,导致此代码正常工作。但是,不幸的是,OfType()方法按确切的类型过滤对象,并且只选择ArticlePageData类的对象。旧的Linq to NH提供程序在相同的情况下选择ArticlePageData和ExtendedArticlePageData。 如何使用新的Linq to NH提供程序进行此类过滤(仅选择类T及其子类的对象)?

您可以使用

var articles = pages.AsEnumerable().OfType<ArticlePageData>().Where(x => x.PublishedDate >= (DateTime.Now - TimeSpan.FromDays(7))).ToList(); session.Query<ArticlePageData>() var articles=pages.AsEnumerable().OfType()。其中(x=>x.PublishedDate>=(DateTime.Now-TimeSpan.FromDays(7)).ToList(); 然后等待NHibernate 3.0.1。 或者你可以用

var articles = pages.AsEnumerable().OfType<ArticlePageData>().Where(x => x.PublishedDate >= (DateTime.Now - TimeSpan.FromDays(7))).ToList(); session.Query<ArticlePageData>() session.Query() 而不是

session.Query<PageData>() session.Query()
session.Query().OfType()
没有什么意义,它不允许您过滤子类的属性。改用
session.Query()

第一个想法很糟糕:它会在内存中加载所有内容。当然,我可以在内存中进行筛选,但在性能方面这是个坏主意。OfType()方法会像NH3.0.1中那样工作吗?我找不到关于它的任何信息。当然,但如果我的应用程序没有大量更改,我就不能使用Query,这就是我问这个问题的原因。我想知道是否存在使用现有IQueryable进行type()筛选的方法。您必须进行更改,因为这是不可能的。@DiegoMijelshon是否存在描述此问题的错误?@alexdev这不是一个错误,我指的是功能。你知道这是否有Jira问题吗?我愿意作出贡献。尽管这种情况下有一个解决方法,但在集合内部进行过滤时,这是一个问题。i、 e.
Blogs.Where(b=>b.Pages.OfType().Any(p=>p.PublishedDate>=DateTime.Now))
您有哪个版本的Linq提供程序?我没有加载NH3.0(NHibernate-3.0.0.GA-bin),但似乎找不到比2.1.2版本更新的提供商。谢谢。由于版本3.0.0,linq提供者是NHibernate的一部分。除了NHibernate本身,您不需要下载任何其他内容。所有linq内容都在NHibernate.linq名称空间中。