0
public class Category
{
    public virtual int Id { set; get; }
    public virtual string Name { set; get; }
    public virtual int CategoryOrder { set; get; }
    public virtual IEnumerable<News> LatestNews { set; get; }
}

public sealed class CategoryMap :ClassMap<Category>
{

    public CategoryMap()
    {
        LazyLoad();
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.CategoryOrder);
        HasMany(x => x.LatestNews);
    }

}

        IRepository<Category> newsRepo = new NHibernateRepository<Category>();

        using(var session = newsRepo.GetSessionFactory().OpenSession())
        using(var transaction = session.BeginTransaction())
        {
            var result = session.Query<Category>().OrderBy(x => x.CategoryOrder);
            transaction.Commit();
        }

我有这个类别类,我想为每个类别显示一个(只有一个)新闻。这是正确的映射吗?或者我应该把它改成Map

当我运行它时,它会获取每个类别的所有新闻。但我想要每个类别的最新消息(只有一个)。我可以通过查询获得最新消息News.DateUpdated

我应该如何更改查询以获取每个类别的一条新闻?

或者我如何获得一些新闻?即:限制我可以查询的新闻数量?

4

2 回答 2

0

你可以额外使用惰性模式来实现这一点,

public News GetLatestNews(Category cat)
{
    var session = SessionFactory.CurrentSession;
    var news = session.CreateFilter(cat.LatestNews , "order by categoryorder").SetFirstResult((page - 1)  * pageSize).SetFirstResult(0).SetMaxResults(1).List().FirstOrDefault();

    return news;
}

但是,如果您尝试直接访问 LatestNews 集合,这将没有任何用处,因为它将从 db 加载与 Category 关联的所有新闻对象,这会降低性能。

于 2012-04-09T03:14:55.850 回答
0

我想你也可以吃蛋糕。你有一个新闻项目列表,所以就留下它。但是添加另一个属性,它只获取您想要的新闻项目。

public class Category
{
    public virtual int Id { set; get; }
    public virtual string Name { set; get; }
    public virtual int CategoryOrder { set; get; }
    public virtual IEnumerable<News> AllNews { set; get; }
    public virtual News LatestNews 
    {
        get
        {
            // probably needs some work
            return this.AllNews.OrderByDescending(n => n.SomeDateField).Take(1);
        }
    }
}

public sealed class CategoryMap :ClassMap<Category>
{

    public CategoryMap()
    {
        LazyLoad();
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.CategoryOrder);
        HasMany(x => x.AllNews);
    }

}
于 2012-04-09T19:00:26.627 回答