Linq to Entities Group, где есть несколько групп без элементов - PullRequest
3 голосов
/ 18 марта 2019

Модельные классы:

public class Video
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime ReleasedDate { get; set; }
    public byte GenreId { get; set; }
    public Genre Genre { get; set; }
    public Classification Classification { get; set; }
    public IList<Tag> Tags { get; set; }
}

public class Genre
{
    public byte Id { get; set; }
    public string Name { get; set; }
    public IList<Video> Videos { get; set; }
}

Например, названия жанров: боевик, драма, комедия и ужас. Для жанров комедии и ужасов нет видео.

Просмотр модели Класс:

public class CountOfVideos
{
    public string Classification { get; set; }
    public int NumberOfMovies { get; set; }
}

Класс контроллера:

 public ActionResult Movies()
    {
        var movies = _context.Videos
            .GroupBy(v => v.Genre.Name)
            .Select(g => new CountOfVideos { Classification = g.Key, NumberOfMovies = g.Count() })
            .ToList();

        return View(movies);
    }

Вид:

@model IEnumerable<LinqTest.ViewModels.CountOfVideos>

<table class="table table-bordered table-hover">
<thead>
    <tr>
        <th>Name</th>
        <th>Count</th>
    </tr>
</thead>
<tbody>
    @foreach (var movie in Model)
    {
        <tr>
            <td>@movie.Classification</td>
            <td>@movie.NumberOfMovies</td>
        </tr>
    }
</tbody>

Код работает правильно, но он не показывает названия жанров, в которых нет видео. Вид генерирует что-то вроде:

Действие 23 Драма 15 но я хотел бы создать Действие 23 Драма 15 Комедия 0 Ужасы 0.

1 Ответ

1 голос
/ 18 марта 2019

Вы должны начать с коллекции, содержащей необходимые вам базовые данные. В данном случае: Жанры.

Что-то вроде:

 public ActionResult Movies() {
  var genres = _context.Genres
   .Select(g => new CountOfVideos {
    Classification = g.Name, NumberOfMovies = g.Videos.Count()
   })
   .OrderBy(c => c.NumberOfMovies)
   .ToList();

  return View(genres);
 }
...