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();
        }

カテゴリごとに(1つだけ)ニュースを表示したいこのカテゴリクラスがあります。これは正しいマッピングですか? または私はそれを変更する必要がありますMap

これを実行すると、カテゴリごとにすべてのニュースが取得されます。しかし、カテゴリごとに最新のニュースが必要です (1 つだけ)。クエリを実行すると、最新のニュースを取得できますNews.DateUpdated

カテゴリごとに 1 つのニュースを取得するには、クエリをどのように変更すればよいですか?

または、ニュースの一部を入手するにはどうすればよいですか? 例: クエリできるニュースの数を制限しますか?

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 に答える