Razor视图中Controller VS中的查询-ASP.NET C#

时间:2018-11-09 13:59:07

标签: c# asp.net asp.net-mvc razor

假设我有一个Books表和一个Chapters。这两个表之间的关系为one-to-many。我想用ASP.NET MVC5创建一个网站,以显示书名及其章节。因此,我可以执行至少2个查询方案以显示所需的数据:


1.查询控制器中的所有数据
BookViewModel.cs

class BookViewModel{
    List<Books> books{set;get;}
    List<ChapterList> chapterLists{set;get;}
}

ChapterList.cs

class ChapterList{
    List<Chapters> chapters{set;get;}
}


  Book.cs(控制器)

public ActionResult Index()
{
    List<Books> books = db.Books.ToList()
    List<ChapterList> chapterList = new List<ChapterList>();
    foreach(Books m in books)
    {
        chapterLists.Add(db.Chapters.Where(m => m.book_id = m.id).ToList());
    }
    BookViewModel bvm = new BookViewModel();
    bvm.books = books;
    bvm.chapterLists = chapterLists
    return view();
}

Index.cshtml(视图)-我想跳过这段代码,因为我假设您知道如何显示它


2.在Razor中查询
  Book.cs(控制器)

public ActionResult Index()
{
    List<Books> books = db.Books.ToList()
    return view(books);
}


  Index.cshtml(视图)

@foreach(Books book in model)
{
    @book.Name
    foreach(Chapters chapter in book.Chapters.ToList())
    {
        @chapter.Name
    }
}

第二种查询方案对我来说是最简单的,但是我不确定哪一种更快。因此,我的问题是,如果有数百万个Books数据并且数据库位于不同的服务器中,哪个是性能最好(或显示视图最快)?还有其他方法可以更快地显示视图吗?

2 个答案:

答案 0 :(得分:0)

是的,还有其他更快的方法可以在实体框架中显示数据,其中之一是使用LINQ查询。

在您的控制器中,您可以执行以下操作:

  getAll () {
    return sequelize
      .query('SELECT * FROM users', { model: User })
      .then(users => {
        console.log('users in database:', users);
        return users;
    })
  }

这比使用foreach遍历每个项目要快。

将所有逻辑保持在控制器级别而不是视图始终是一个好习惯。

答案 1 :(得分:0)

您可以在DbSet上使用Include方法。

我试图简化和加快您的查询。您可以在下面查看。 在控制器中

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var db = new YourDbContext();
        var booksWithChapterList =
            db.Books
            .Include(s => s.chapterLists) //I add chapterList to query, so I don't fetch another query.
            .Select(s => new BookDto// I convert them to smaller data transfer object.
            {
                Name = s.Name,
                Chapters = s.chapterLists.Select(w => new BookChapterDto
                {
                    Name = w.Name
                }).ToList()
            })
            .ToList();
        return View(booksWithChapterList);
    }
}

您可以在这里找到使用的类:

public class BookDto
{
    public string Name { get; set; }
    public IList<BookChapterDto> Chapters { get; set; }

}
public class BookChapterDto
{
    public string Name { get; set; }
}

希望这会有所帮助。