NHibernate 3 LINQ: Как отфильтровать IQueryable для выбора только объектов класса T и его подклассов? - PullRequest
3 голосов
/ 02 января 2011

Я хочу обновить свое приложение, чтобы использовать 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?

Ответы [ 2 ]

2 голосов
/ 02 января 2011

session.Query<T>().OfType<SubT>() не имеет большого смысла, и это не позволит вам фильтровать свойства подкласса.Вместо этого используйте session.Query<SubT>().

0 голосов
/ 02 января 2011

Вы можете использовать

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