Лучший отвечающий
ASP.NET создание баз данных

Вопрос
-
Здравствуйте, Всем!
Вопрос такого плана, я прошёл урок по созданию музыкального магазина. Но знаний у меня маловато. В Уроке создавалось меню из таблицы 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) для элементов второго уровня.
- Помечено в качестве ответа Abolmasov DmitryModerator 18 января 2011 г. 0:03
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);
- Помечено в качестве ответа Abolmasov DmitryModerator 18 января 2011 г. 0:03
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) для элементов второго уровня.
- Помечено в качестве ответа Abolmasov DmitryModerator 18 января 2011 г. 0:03
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);
- Помечено в качестве ответа Abolmasov DmitryModerator 18 января 2011 г. 0:03
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