#

 

 

 

Wenn man in einer View Ansicht Daten von einer eingebundenen Tabelle anzeigen möchte, dann verwendet man das sogenannte Eager loading.

Dabei wird in der View folgendes gemacht

 

 

Will man zum Beispiel in der folgenden Liste von Artikeln auch die Bezeichung der zugeordneten Produktgruppen wissen, dann muss man diese dazuladen.

 

Index-View in Views/Artikel.cs

Artikel

Produktgruppe

Akkuschrauber

Akku-Schrauber

Maschine

Bohrmaschinen

Maschine 2

Bohrmaschinen

 

 

Dabei wird aus den Bewegungsdaten Artikel informationen aus einer Basisdaten Datei Info geholt, wobei beide Tabellen über eine ID der Infodatei verbunden sind.

Die Informationsdatei ist in diesem Fall die Produktgruppen-Information.

 

Lösung:

 

Controller:

Im Artikel-Controller bindet man vor der Auflistung .ToList() die referenzierten Werte ein mit einem .Include(verweis)

List<Artikel> artikel = _context.Artikel.Include(a=>a.Produktgruppe ).ToList();

 

Für die Include() Anweisung muss der Entity Framework eingebunden werden

using Microsoft.EntityFrameworkCore;

 

 

Model:

Im Model muss die referenzierende Tabelle eingebunden sein

public Produktgruppen Produktgruppe { get; set; }

 

 

 

 

View:

In der View wird mit der Razor-Begriff direkt der Feldwert der referenzierten Tabelle angegeben

@artikel.Produktgruppe.Produktgruppe

 

 

Die Datei Views/Artikel/Index.cs

 

View Code

@model IEnumerable<ArtikelWeb.Models.Artikel >

..

            @foreach (Artikel artikel in Model)

            {

            <tr>

                <td>

                    @artikel.Title 

                </td>

                <td>

                    @artikel.Produktgruppe.Produktgruppe 

                </td>

..

 

 

 

 

Dabei werden dann nur noch diese Daten angezeigt, welche eine eindeutige Bindung zu der Produktgruppe haben.

Im Beispiel wird der erste Artikel mit einer 0 in der IDProduktgruppe dann leider nicht mehr angezeigt.

 

Komplettes Beispiel Artikel Model

using System;

using System.Collections.Generic;

using System.ComponentModel.DataAnnotations; //*[key]

using System.Linq;

using System.Threading.Tasks;

 

namespace ArtikelWeb.Models

{

    public class Artikel

    {

        [Key]

        public int IDArtikel { get; set; }

        public string Title { get; set; }

        public string Text_Content { get; set; }

        public Produktgruppen Produktgruppe { get; set; }

        public int IDProduktgruppe { get; set; }

    }

}

 

 

 

Alle anderen Artikel, welche keinen Passenden Eintrag zu einer Produktgruppe haben, werden nicht mehr gelistet. Das entspricht in SQL einer Inner Join

 

 

 

Video Tutorial

https://www.youtube.com/watch?v=aOWht6j_6es&feature=youtu.be

 

 

Kompletter Controller Code

using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;

using Microsoft.AspNetCore.Mvc;

using ArtikelWeb.Models;

using Microsoft.EntityFrameworkCore;    //*DbContext or ApplicationDbContext

 

namespace ArtikelWeb.Controllers

{

    public class ArtikelController : Controller

    {

        private readonly app_DbContext _context;

 

        //ctor

        public ArtikelController(app_DbContext context)

        {

            _context = context;

        }

       

        protected override void Dispose(bool disposing)

        {

            _context.Dispose();

        }

 

        public IActionResult Index()

        {

            //List<Artikel> artikel = _context.Artikel.ToList();

            List<Artikel> artikel = _context.Artikel.Include(a=>a.Produktgruppe ).ToList();

            return View(artikel);

        }

 

 

 

        public IActionResult Details(int ID)

        {

            Artikel artikel= _context.Artikel.SingleOrDefault(a =>a.IDArtikel == ID);

            if (artikel == null) return NotFound();

            return View(artikel);

        }

 

     

      

        public IActionResult Edit(int ProductID) //*Asp.Net convention

        {

            //--------< Detail() >------------

            return Content("ID=" + ProductID);

            //--------</ Detail() >------------

        }

 

      

 

 

    }

}

 

 

 

 

Komplette Beispiel View Code /Views/Artikel/Index.cshtml

@model IEnumerable<ArtikelWeb.Models.Artikel >

@*@model ArtikelWeb.Models.Artikel*@

 

@{

    ViewData["Title"] = "Index";

    Layout = "~/Views/Shared/_Layout.cshtml";

}

 

<h2>Index</h2>

 

<p>

    <a asp-action="Create">Create New</a>

</p>

@*@if (!Model.Any())

    {

        <p>Keine Artikel vorhanden </p>

    }

    else

    {*@

    @*//-------- Tabelle: Artikel --------*@

    <table class="table">

        <thead>

            <tr>

                <th>Artikel</th>

                <th>Produktgruppe</th>

            </tr>

        </thead>

        <tbody>

            @foreach (Artikel artikel in Model)

            {

            <tr>

                <td>

                    @artikel.Title 

                </td>

                <td>

                    @artikel.Produktgruppe.Produktgruppe 

                </td>

 

 

                <td>

                    <a asp-action="Edit" asp-route-id="@artikel.IDArtikel">Edit</a> |

                    <a asp-action="Details" asp-route-id="@artikel.IDArtikel">Details</a> |

                    <a asp-action="Delete" asp-route-id="@artikel.IDArtikel">Delete</a>

                </td>

            </tr>

            }

        </tbody>

    </table>

    @*//--------/ Tabelle: Artikel --------*@

@*}*@

 

 

@*Aenderung:

Html.DisplayFor(modelItem => item.Title)

wird zu

artikel.Title*@

 

 

Mobile

.

123movies