1

Je suis très confus lorsque j'obtiens des données de plusieurs tables. J'utilise les premières approches MVVM et Database sur mon projet.Entity Framework, obtention de données à partir de plusieurs tables et sélection des colonnes à afficher

Tables

My Tables

J'ai trois tables avec de nombreux à-plusieurs: Chambre, ApartmentRoom et Appartement.

RoomController

public class ApartmentController : Controller 
{ 
    private readonly IApartmentRepository _apartmentRepository; 

    public ApartmentController(IApartmentRepository apartmentRepository) 
    { 
     _apartmentRepository = apartmentRepository; 
    } 

    //...codes 

    [HttpGet] 
    public ActionResult List() 
    { 
     var apartmentList = _apartmentRepository.GetAll().ToList(); 
     return View(apartmentList); 
    } 

    //...codes 
} 

List.cshtml

<div class="dataTables_wrapper"> 
<table class="table table-bordered table-striped" id="dataTable"> 
    <thead> 
     <tr> 
      <th>Id</th> 
      <th>Door Number</th> 
      <th>Floor Number</th> 
      <th>Capacity</th> 
      <th>Fullness</th> 
      <th>Apartment Name</th> 
      <th></th> 
     </tr> 
    </thead> 
    <tbody> 
     @foreach (var item in Model.ToList()) 
     { 
      <tr> 
       <td>@item.Id</td> 
       <td>@item.DoorNumber</td> 
       <td>@item.FloorNumber</td> 
       <td>@item.Capacity</td> 
       <td>@item.Fullness</td> 
       <td>@item.ApartmentRoom.Where(x => x.RoomID == item.Id).Select(x => x.Apartment.ApartmentName)</td> 
       <td> 
        @Html.ActionLink("Düzenle", "Edit", new { id = item.Id }) 
        @Html.ActionLink("Sil", "Delete", new { id = item.Id }) 
       </td> 
      </tr> 
     } 
    </tbody> 
</table> 

J'ai essayé d'obtenir les champs que je veux montrer dans le tableau avec une syntaxe à base de la méthode, mais je ne pouvais pas montrer les noms des appartements auxquels appartiennent les chambres.

Résultat

Result Image

De l'avis, je veux la liste des tous les champs de la table Room et ApartmentName champ de la table Apartment.

+0

Vous devez probablement désactiver le chargement différé dans la configuration dbcontext ou utiliser la méthode 'Include' pour obtenir des enregistrements de table enfant. –

Répondre

2
<td>@item.ApartmentRoom.Where(x => x.RoomID == item.Id).Select(x => x.Apartment.ApartmentName)</td> 

^^ Ce juste appelle ToString sur une IEnumerable, ce qui est la raison pour laquelle vous obtenez cette sortie étrange dans votre point de vue. Vous souhaitez utiliser la méthode Include sur votre DbSet<Apartment> pour charger les entités associées, puis utiliser First pour obtenir l'entité associée en question. La surcharge de Include prenant une expression lambda (context.Apartments.Include(a => a.Rooms)) réside dans l'espace de noms System.Data.Entity.

Plus:

<td>@item.ApartmentRoom.First(x => x.RoomID == item.Id).ApartmentName</td> 
+0

Merci pour votre aide monsieur. Vous avez sauvé ma journée :) – Utku

1
<td>@item.ApartmentRoom.Where(x => x.RoomID == item.Id).Select(x => x.Apartment.ApartmentName).FirstOrDefault()</td> 

est ce que vous recherchez, vous obtenez l'article réelle et non la requête, mais je crois que votre logique est un peu cassée.

+0

Votre code a également travaillé pour moi. Merci de votre aide. – Utku