c# - ASP.NET MVC 父子记录 iCollection 第一项
问题描述
我有1-many 关系的表Albums
。Images
模型是使用 EF 数据库优先方法自动生成的。
我想获取所有专辑及其图片,并在专辑列表页面上仅显示每个专辑的第一张图片。但我很困惑,ICollection
没有索引,我无法将其转换为视图内的列表。
有时它说它是 Hashset
专辑.cs
public partial class Album
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Album()
{
this.Images = new HashSet<Image>();
}
public int id { get; set; }
public string title { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Image> Images { get; set; }
}
图片.cs
public partial class Image
{
public int id { get; set; }
public int album_id { get; set; }
public string img { get; set; }
public string title { get; set; }
public virtual Album Album { get; set; }
}
家庭控制器.cs
ViewBag.Albums = db.Albums.Where(a => a.status == 1)
.Select(c => new
{
Album = c,
Image = c.Images.OrderBy(i => i.sort)
})
.AsEnumerable() // not execute yet
.Select(a => a.Album)
.OrderBy(a => a.sort)
.Take(6)
.ToList();
查看.html
@if (ViewBag.Albums != null) {
foreach (var item in ViewBag.Albums)
{
<div class="album">
@{
string default_image = "no-img.png";
if (item.Images.Count > 0)
{
//var firstImg = item.Images.First();//this showing error that item.image dont have first()
//List<myproject.Models.Image> images = item.Images.ToList();//this also say hashset has no list()
//inside 1 albums many images can be returned, I want to display first one only.
default_image = item.id + "/" + item.Images[0].img;
}
int indx = 1;
}
</div>
}
}
解决方案
首先:您必须创建一个视图模型
public class ImageAlbumView
{
public Image Image {get;set;}
public Album Album {get;set;}
}
HomeController.cs:
ViewBag.Albums = db.Albums.Where(a => a.status == 1)
.Select(c => new ImageAlbumView()
{
Album = c,
Image = c.Images.OrderBy(i => i.id)
})
.AsEnumerable() // not execute yet
.Select(a => a.Album)
.OrderBy(a => a.Image.id)
.Take(6)
.ToList();
查看.html:
@if ((List<ImageAlbumView>)ViewBag.Albums != null) {
foreach (ImageAlbumViewitem in (List<ImageAlbumView>)ViewBag.Albums)
{
<div class="album">
@{
string default_image = "no-img.png";
if (item.Images.Count > 0)
{
default_image = item.id + "/" + item.Images[0].img;
}
int indx = 1;
}
</div>
}
}
推荐阅读
- android - 无法更改 MutableList 中的对象属性
- woocommerce - 自定义产品类型在更新时不更改类型
- android - 在 Android 10 中以更“通用”的方式断开与 Wi-Fi 网络的连接
- laravel - 使用 Laravel 在嵌套路由中调用 2 次 VueJS 组件
- java - 为什么“addOnSuccessListener”的代码在以下代码块中的执行过程中会被跳过?
- mysql - PowerBI 报告托管在 AWS 上的 MySQL 并刷新
- vba - 有没有办法在没有 SQLStudio 的情况下在 VB 中使用 SQLite?
- java - 如何从文件中获取序列化对象的特定实例?
- sql - SQL 返回选定值的新列
- c++ - 使用 zlib 压缩的 boost socket iostreams echo 服务器休眠,直到连接关闭