假设我有一个Books
表和一个Chapters
。这两个表之间的关系为one-to-many
。我想用ASP.NET MVC5创建一个网站,以显示书名及其章节。因此,我可以执行至少2个查询方案以显示所需的数据:
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(视图)-我想跳过这段代码,因为我假设您知道如何显示它
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
数据并且数据库位于不同的服务器中,哪个是性能最好(或显示视图最快)?还有其他方法可以更快地显示视图吗?
答案 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; }
}
希望这会有所帮助。