none
ASP.NET создание баз данных RRS feed

  • Вопрос

  • Здравствуйте, Всем!

    Вопрос такого плана, я прошёл урок по созданию музыкального магазина. Но знаний у меня маловато. В Уроке создавалось меню из таблицы Genre -одноуровневое, дальше с него переходило на страницу с альбомами. Мне же надо двухуровневое меню. Допустим я имею три таблица.

    table1                                           table2

    table1iD  Name                             table2 id    table1 id     Title

    1             машины                              1               1            toyota

    2             пылесосы                           2               1            ford

                                                               3               2            samsung

                                                               4               2            bosh

     

    Третья таблица мне не важна сейчас, по ней из урока понятно как сделать, а вот тут такой вопрос:

    Мне нужно получить меню такого формата:

    машины

      toyota

      ford

    пылесосы

     samsung

     bosh

    В примере музыкального магазина даётся создание класса StoreIndexViewModel с содержанием:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Web;

    namespace MvcMusicStore.ViewModels

    {

        public class StoreIndexViewModel

        {

            public int NumberOfGenres { get; set; }

            public List<string> Genres { get; set; }

        }

    }

    И класс контроллера MusicStoreEntities с содержанием в нём:

    /

    // GET: /Store/

    public ActionResult Index()

    {

        // Извлечение списка жанров из базы данных

        var genres = from genre in storeDB.Genres

                        select genre.Name;

        //Установка модели ViewModel

        var viewModel = new StoreIndexViewModel()

        {

            Genres = genres.ToList(),

            NumberOfGenres = genres.Count()

        };

        // Возврат представления

        return View(viewModel);

    }

    Здесь всё понятно как строиться одноуровневое меню, а вот как два и более построить(мне нужно два уровня) я конечно из примера не вижу, да и на сайте инфы не удалось найти. Я понимаю, что дело в запросе  var genres = from genre in storeDB.Genres, но как мне сформировать запрос при моих условиях я не знаю. Потому что новичок. На php я знаю как это сделать, но здесь как я понял иная модель. Прошу по возможности объяснить подробно. Просьба не кидать на англицкие сайты, с языком у меня плохо, хотя сейчас я любой инфе рад буду.

     

    14 января 2011 г. 1:10

Ответы

  • Вот пример такого запроса:

    var genres = from genre in storeDB.Genres.Include("Albums") select genre;
    

    Здесь Include("Albums") указывает, что нужно загрузить подчиненную таблицу с альбомами. В терминах T-SQL это операция JOIN.

    При этом нужно

    public List<string> Genres { get; set; }
    

    заменить на

    public List<Genre> Genres { get; set; }
    

    чтобы каким-то образом сохранять информацию об иерархии (простой плоский список здесь не подойдет).

    Ну, и соответствующим образом изменить представление, чтобы оно отображало genre.Name в цикле (foreach Genre genre in viewModel.Genres) для элементов верхнего уровня и album.Title во вложенном цикле (foreach Album album in genre.Albums) для элементов второго уровня.

    14 января 2011 г. 7:54
  • PS. Если Вас не устраивает вариант с JOIN (который возвращает избыточную информацию), можете воспользоваться вариантом с последовательными SELECT:

    var viewModel = new StoreIndexViewModel();
    viewModel.Genres = storeDB.Genres.ToList();
    foreach (Genre genre in viewModel.Genres)
      storeDB.LoadProperty(genre, genreItem => genreItem.Album);
    

    14 января 2011 г. 8:00

Все ответы

  • Вот пример такого запроса:

    var genres = from genre in storeDB.Genres.Include("Albums") select genre;
    

    Здесь Include("Albums") указывает, что нужно загрузить подчиненную таблицу с альбомами. В терминах T-SQL это операция JOIN.

    При этом нужно

    public List<string> Genres { get; set; }
    

    заменить на

    public List<Genre> Genres { get; set; }
    

    чтобы каким-то образом сохранять информацию об иерархии (простой плоский список здесь не подойдет).

    Ну, и соответствующим образом изменить представление, чтобы оно отображало genre.Name в цикле (foreach Genre genre in viewModel.Genres) для элементов верхнего уровня и album.Title во вложенном цикле (foreach Album album in genre.Albums) для элементов второго уровня.

    14 января 2011 г. 7:54
  • PS. Если Вас не устраивает вариант с JOIN (который возвращает избыточную информацию), можете воспользоваться вариантом с последовательными SELECT:

    var viewModel = new StoreIndexViewModel();
    viewModel.Genres = storeDB.Genres.ToList();
    foreach (Genre genre in viewModel.Genres)
      storeDB.LoadProperty(genre, genreItem => genreItem.Album);
    

    14 января 2011 г. 8:00
  • foreach (Genre genre in Model.Genres) - в представлении пишет ошибку. Не удалось найти имя типа или пространства имен 'Genre' (возможно, пропущена используемая директива или ссылка на сборку) В примере было foreach (string genreName in Model.Genres) { фуф...однако сложно даётся, как шаман с бубном.
    16 января 2011 г. 9:13
  • Ссылку Вы можете разрешить, установив курсор на Genre и нажав Alt + Shift + F10. В общем случае в разделе объявления подключаемых пространств имен (в верхней части файла) должна добавиться строка, вроде "using MvcMusicStore.Models".
    16 января 2011 г. 11:27