有许多映射,但得到一个元素或得到一些
本文关键字:一个 元素 许多 映射 | 更新日期: 2023-09-27 18:30:38
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
来获取最新消息。
我应该如何更改查询以获取每个类别一个新闻?
或者我如何获取一些新闻? 即:限制我可以查询的新闻数量?
我想你也可以吃你的蛋糕。你有一个新闻项目列表,所以就离开它。但是添加另一个属性,该属性仅获取所需的新闻项。
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);
}
}
你可以使用额外的懒惰模式来实现这一点,
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 集合,这将没有任何用处,因为它将从数据库加载与 Category 关联的所有新闻对象,这会降低性能。