不使用NHibernate对象返回列表

用户名

假设我有一个接口。

public interface IBlogRepository
{
    IList<Blog> Blogs(int pageNo, int pageSize);
    int TotalPosts();
}

现在,我创建了一个类来实现它并使用NHibernate。

using NHibernate;
using NHibernate.Criterion;
using NHibernate.Linq;
using NHibernate.Transform;
using System.Collections.Generic;
using System.Linq;

namespace JustBlog.Core
{
    public class BlogRepository: IBlogRepository
    {
        // NHibernate object
        private readonly ISession _session;

        public BlogRepository(ISession session)
        {
            _session = session;
        }

        public IList<Post> Posts(int pageNo, int pageSize)
        {
            var query = _session.Query<Post>()
                        .Where(p => p.Published)
                        .OrderByDescending(p => p.PostedOn)
                        .Skip(pageNo * pageSize)
                        .Take(pageSize)
                        .Fetch(p => p.Category);

            query.FetchMany(p => p.Tags).ToFuture();

            return query.ToFuture().ToList();
        }

        public int TotalPosts()
        {
            return _session.Query<Post>().Where(p => p.Published).Count();
        }
    }

上面的代码来自网络上用于创建博客引擎的位置但是我一点都不了解NHibernate,我使用Entity Framework来完成我的工作。

如何不使用NHiberate重写代码?

戴维

实体模型

假设我们有这样的实体模型:

public class Post
{
    public Post() { Tags = new List<Tag>(); }

    public int Id{ get; set; }
    public string Title{ get; set; }
    public string ShortDescription{ get; set; }
    public string Description{ get; set; }
    public string Meta{ get; set; }
    public string UrlSlug{ get; set; }
    public bool Published{ get; set; }
    public DateTime PostedOn{ get; set; }
    public DateTime? Modified{ get; set; }

    public int CategoryId { get; set; }
    public virtual Category Category{ get; set; }

    public virtual IList<Tag> Tags{ get; set; }
}

public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string UrlSlug { get; set; }
    public string Description { get; set; }

    public virtual IList<Post> Posts { get; set; }
}

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string UrlSlug { get; set; }
    public string Description { get; set; }

    public virtual IList<Post> Posts { get; set; }
}

语境

我们的上下文类非常简单。构造函数采用in形式的连接字符串web.config,我们定义了三个DbSet

public class BlogContext : DbContext
{
    public BlogContext() : base("BlogContextConnectionStringName") { }

    public DbSet<Category> Categories { get; set; }
    public DbSet<Post> Posts { get; set; }
    public DbSet<Tag> Tags { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    }
}

资料库

我们的博客存储库的界面非常简单,并且变化不大:

public interface IBlogRepository
{
    IEnumerable<Post> Posts(int pageNo, int pageSize);
    int TotalPosts();
}

这是博客库本身,事情变得很有趣!

public class BlogRepository : IBlogRepository
{
    // NHibernate object replace with our context
    private readonly BlogContext _blogContext;

    public BlogRepository(BlogContext blogContext)
    {
        _blogContext = blogContext;
    }

    //Function to get a list of blogs
    public IEnumerable<Post> Posts(int pageNo, int pageSize)
    {
        //We start with the blogs db set:
        var query = _blogContext.Posts
            //Filter by Published=true
            .Where(p => p.Published)
            //Order by date they were posted
            .OrderByDescending(p => p.PostedOn)
            //Jump through the list
            .Skip(pageNo * pageSize)
            //Get the required number of blogs
            .Take(pageSize)
            //Make sure the query include all the categories
            .Include(b => b.Category);

        //Just return what we have!
        return query;
    }

    //Much simpler function, should be pretty self explanatory
    public int TotalPosts()
    {
        return _blogContext.Posts.Where(p => p.Published).Count();
    }
}

下一步

好的,现在我们已完成所有设置,并在您的web.config中设置了一个不错的连接字符串,我们该如何处理?好吧,让我们来一些博客!

var context = new BlogContext();
var repository = new BlogRepository(context);
var posts = repository.Posts(0, 10);

然后,我们可以对这些博客做一些事情:

foreach(var blog in blogs)
{
    Console.WriteLine("Blog Id {0} was posted on {1} and has {2} categories", blog.Id, blog.PostedOn, blog.Categories.Count());
}

笔记

我没有实现这些FetchMany/ToFuture部分,因为这里不需要它们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

NHibernate返回错误的对象列表

来自分类Dev

NHibernate返回错误的对象列表

来自分类Dev

Javascript Promise 不使用对象填充列表

来自分类Dev

不使用hashmap java过滤对象列表

来自分类Dev

使用Stripe返回的对象/列表

来自分类Dev

nhibernate通过代码映射,使用值对象列表映射实体

来自分类Dev

nhibernate通过代码映射,使用值对象列表映射实体

来自分类Dev

返回列表[String]使用逗号与不使用逗号

来自分类Dev

为什么不使用内容协商来返回JSON对象?

来自分类Dev

不使用原型链并返回对象的优点/缺点

来自分类Dev

不使用原型链并返回对象的优点/缺点

来自分类Dev

方法首先返回非空对象而不使用太多 if else

来自分类Dev

使用通配符返回通用类型对象的列表

来自分类Dev

如何使用列表C#返回对象

来自分类Dev

使用Lodash / Underscore从对象列表中跳过并返回对象

来自分类Dev

使用列表将 XML 解组为对象返回空对象

来自分类Dev

nhibernate中的值对象的映射列表

来自分类Dev

使用AliasToBeanResultTransformer返回整数列表时,找不到Nhibernate属性异常

来自分类Dev

异步返回对象列表

来自分类Dev

在不使用包装内部类的情况下使用Retrofit获取对象列表

来自分类Dev

不使用mysqlnd返回多行

来自分类Dev

是否可以使用Java从AS400返回对象列表?

来自分类Dev

PostgreSQL:如何在不使用“列定义列表”的情况下从表返回动态行?

来自分类Dev

为什么不使用运算符重载方法初始化返回的对象?

来自分类Dev

Mongodb:在不使用 unwind 的情况下返回对象数组中的字段的项目

来自分类Dev

Haskell:串联列表而不使用(++)

来自分类Dev

不使用列表的设施计数

来自分类Dev

Firebase-如何在不使用AngularFire的情况下获取对象列表

来自分类Dev

是否可以在不使用对象或数组的情况下显示:none 查询列表?

Related 相关文章

  1. 1

    NHibernate返回错误的对象列表

  2. 2

    NHibernate返回错误的对象列表

  3. 3

    Javascript Promise 不使用对象填充列表

  4. 4

    不使用hashmap java过滤对象列表

  5. 5

    使用Stripe返回的对象/列表

  6. 6

    nhibernate通过代码映射,使用值对象列表映射实体

  7. 7

    nhibernate通过代码映射,使用值对象列表映射实体

  8. 8

    返回列表[String]使用逗号与不使用逗号

  9. 9

    为什么不使用内容协商来返回JSON对象?

  10. 10

    不使用原型链并返回对象的优点/缺点

  11. 11

    不使用原型链并返回对象的优点/缺点

  12. 12

    方法首先返回非空对象而不使用太多 if else

  13. 13

    使用通配符返回通用类型对象的列表

  14. 14

    如何使用列表C#返回对象

  15. 15

    使用Lodash / Underscore从对象列表中跳过并返回对象

  16. 16

    使用列表将 XML 解组为对象返回空对象

  17. 17

    nhibernate中的值对象的映射列表

  18. 18

    使用AliasToBeanResultTransformer返回整数列表时,找不到Nhibernate属性异常

  19. 19

    异步返回对象列表

  20. 20

    在不使用包装内部类的情况下使用Retrofit获取对象列表

  21. 21

    不使用mysqlnd返回多行

  22. 22

    是否可以使用Java从AS400返回对象列表?

  23. 23

    PostgreSQL:如何在不使用“列定义列表”的情况下从表返回动态行?

  24. 24

    为什么不使用运算符重载方法初始化返回的对象?

  25. 25

    Mongodb:在不使用 unwind 的情况下返回对象数组中的字段的项目

  26. 26

    Haskell:串联列表而不使用(++)

  27. 27

    不使用列表的设施计数

  28. 28

    Firebase-如何在不使用AngularFire的情况下获取对象列表

  29. 29

    是否可以在不使用对象或数组的情况下显示:none 查询列表?

热门标签

归档