Запрос в контроллере VS в Razor View - ASP.NET C # - PullRequest
0 голосов
/ 09 ноября 2018

Допустим, у меня есть Books таблица и Chapters. Эти 2 таблицы связаны между собой 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 голосов
/ 09 ноября 2018

Вы можете использовать Включить метод в DbSet.

Я попытался упростить и ускорить ваш запрос. Вы можете проверить ниже. В контроллере

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

Надеюсь, это поможет.

0 голосов
/ 09 ноября 2018

Да, есть другой более быстрый способ отображения данных в Entity Framework, один из них - использование LINQ Queries.

В вашем контроллере вы можете сделать что-то вроде этого:

public ActionResult Index()
{
    List<Books> books = db.Books.ToList()
    List<ChapterList> chapterList = (from a in db.Books
                                    join b in db.Charpters on a.id equals b.BookId
                                    //where a.id==3 you can also query for specific book
                                    select new ChapterList
                                    {
                                     chapter=b.chapter
                                    }).ToList();

    BookViewModel bvm = new BookViewModel();
    bvm.books = books;
    bvm.chapterLists = chapterLists
    return view();
}

Это будет быстрее, чем циклически проходить через каждый элемент, используя foreach.

Хорошей практикой всегда является сохранение всей вашей логики на уровне контроллера вместо представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...