Entity Framework,从多个表中获取数据并选择要显示的列
Entity Framework, getting data from multiple tables and choosing columns to display
我在从多个 table 获取数据时感到很困惑。我在我的项目中使用 MVVM 和数据库优先方法。
表格
我有三个具有多对多关系的 table:Room、ApartmentRoom 和 Apartment。
房间控制器
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>
我尝试使用基于方法的语法获取我想在 table 中显示的字段,但我无法显示房间所属的公寓名称。
结果
在视图中,我想列出 Room
table 的所有字段和 Apartment
table 的 ApartmentName
字段。
<td>@item.ApartmentRoom.Where(x => x.RoomID == item.Id).Select(x => x.Apartment.ApartmentName)</td>
^^这只是在 IEnumerable
上调用 ToString,这就是您在视图中得到奇怪输出的原因。您想在 DbSet<Apartment>
上使用 Include
方法加载任何相关实体,然后使用 First
获取相关实体。 Include 采用 lambda 表达式 ( context.Apartments.Include(a => a.Rooms)
) 的重载存在于 System.Data.Entity
命名空间中。
更像是:
<td>@item.ApartmentRoom.First(x => x.RoomID == item.Id).ApartmentName</td>
<td>@item.ApartmentRoom.Where(x => x.RoomID == item.Id).Select(x => x.Apartment.ApartmentName).FirstOrDefault()</td>
是您所追求的,所以您得到的是实际的项目而不是查询,但我相信您的逻辑有些不对。
我在从多个 table 获取数据时感到很困惑。我在我的项目中使用 MVVM 和数据库优先方法。
表格
我有三个具有多对多关系的 table:Room、ApartmentRoom 和 Apartment。
房间控制器
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>
我尝试使用基于方法的语法获取我想在 table 中显示的字段,但我无法显示房间所属的公寓名称。
结果
在视图中,我想列出 Room
table 的所有字段和 Apartment
table 的 ApartmentName
字段。
<td>@item.ApartmentRoom.Where(x => x.RoomID == item.Id).Select(x => x.Apartment.ApartmentName)</td>
^^这只是在 IEnumerable
上调用 ToString,这就是您在视图中得到奇怪输出的原因。您想在 DbSet<Apartment>
上使用 Include
方法加载任何相关实体,然后使用 First
获取相关实体。 Include 采用 lambda 表达式 ( context.Apartments.Include(a => a.Rooms)
) 的重载存在于 System.Data.Entity
命名空间中。
更像是:
<td>@item.ApartmentRoom.First(x => x.RoomID == item.Id).ApartmentName</td>
<td>@item.ApartmentRoom.Where(x => x.RoomID == item.Id).Select(x => x.Apartment.ApartmentName).FirstOrDefault()</td>
是您所追求的,所以您得到的是实际的项目而不是查询,但我相信您的逻辑有些不对。