Получение различных полей из косвенно связанной таблицы - PullRequest
0 голосов
/ 09 марта 2012

Я новичок в MVC3, поэтому прошу прощения, если это основной, но я не смог разобраться.

У меня есть модель представления, которая включает в себя 3 таблицы, таблицу 'Albums' с 2 внешними ключами(Идентификатор исполнителя и идентификатор метки).

У меня есть контроллер «Метки» и метод «Подробности», в котором отображаются поля таблицы меток.Я пытаюсь получить отличных «исполнителей» из коллекции альбомов, связанных с ярлыком.

В данный момент я могу получить имена исполнителей, но один создается для каждого альбома - я включилкод для этого сценария ниже.

Я пробовал кучу разных вещей, например, включение Художников в коллекцию и использование функций Distinct и group by, но безрезультатно.Не уверен, что это выполнимо, или из-за косвенной связи между таблицами мне нужно использовать другой подход.

Любая помощь очень ценится.

Контроллер:

 public ActionResult Details(int id)
    {

        var viewModel = new LabelsDetailsVM();
        viewModel.Lables = db.Labels
            .Include(a => a.Albums)
            .SingleOrDefault(x => x.LabelID == id);

        return View(viewModel);

Просмотр:

 @foreach (var artist in Model.Lables.Albums)
    {
        <tr>
            <td>
                @Html.DisplayFor(model => artist.Artist.ArtistName)
            </td>
        </tr>
    }

Просмотр модели

   public class LabelsDetailsVM
{
    public Label Lables { get; set; }
    public IEnumerable<Album> Albums { get; set; }
    public IEnumerable<Artist> Artists { get; set; }
}

} ​​

1 Ответ

0 голосов
/ 12 марта 2012

Вот пример, который может привести вас на правильный путь:

смотреть модель:

public class LabelViewModel
{
    public Label Label { get; set; }
    public IEnumerable<Artist> Artists { get; set; }
}

Контроллер:

public class LabelController : Controller
{
    public ActionResult Details(int id)
    {
        var label = db.Labels
            .Include(l => l.Albums)
            .SingleOrDefault(l => l.LabelID == id);

        if (label == null)
        {
            return HttpNotFound();
        }

        var distinctArtists = label
            .Albums
            .Select(a => a.Artist)
            .Distinct(ArtistComparer.Default);

        var model = new LabelViewModel
        {
            Label = label,
            Artists = distinctArtists
        };

        return View(model);
    }
}

и средство сравнения равенства, используемое для различения двух исполнителей, используемых в контроллере, которые, конечно, могут быть адаптированы в соответствии с вашими требованиями. В этом примере он считает, что 2 художника представляют одну и ту же сущность, если у них одинаковый идентификатор. Но вы можете работать с некоторыми другими свойствами, такими как имя и так далее, все зависит от того, что вам нужно:

public class ArtistComparer : IEqualityComparer<Artist>
{
    protected ArtistComparer()
    {

    }

    private static readonly IEqualityComparer<Artist> _default = new ArtistComparer();
    public static IEqualityComparer<Artist> Default
    {
        get
        {
            return _default;
        }
    }

    public bool Equals(Artist x, Artist y)
    {
        if (x != null && y != null)
        {
            return x.ArtistID.Equals(y.ArtistID);
        }
        return false;
    }

    public int GetHashCode(Artist obj)
    {
        return obj.ArtistID.GetHashCode();
    }
}

Вид:

@model LabelViewModel

<h3>@Html.DisplayFor(x => x.Label.LabelName)</h3>

<div>Artists</div>
<table>
    <thead>
        <tr>
            <th>artist name</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var artist in Model.Artists)
        {
            <tr>
                <td>@artist.ArtistName</td>
            </tr>
        }
    </tbody>
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...