我有两个条目和图片实体。每个项目可以有多张图片,但是当我列出项目时,我只想返回每个项目的一张图片。
项目类
public class Item
{
[Key]
public int ItemID { get; set; }
public string Name{ get; set; }
public string Status{ get; set; }
public virtual ICollection<Picture> Pictures{ get; set; } // Navigation property
}
图片类
public class Picture
{
[Key]
public int PictureID { get; set; }
public string Filename{ get; set; }
public string Filepath{ get; set; }
public int ItemID { get; set; } // Foreign Key
public virtual Item Item{ get; set; } // Navigation property
}
控制器
public ActionResult Lager()
{
var model = _db.Items.Include(b => b.Pictures.FirstOrDefault()).Where(i =>
i.Status == 0)
return View(model);
}
我从控制器得到这个错误
Include路径表达式必须引用在该类型上定义的导航属性。引用导航属性使用点点路径,集合导航属性使用Select操作符。
视图是强类型的
@model IEnumerable<MyProject.Models.Koeretoej>
<div">
@foreach(var item in Model){
<ul>
<li>
<span class="icon">
<img src="@item.Pictures.Filepath@item.Billeder.Filepath"/>
</span>
</li>
<li><span class="text">@item.Name</span></li>
<li><span class="text">@item.Status</span></li>
</ul>
}
</div>
在我看来,我想将Filepath
和Filename
结合使用,用于img
的src。但是我不知道该怎么做。
我假设你正在使用Linq for Entities。Include指定要包含在查询结果中的相关对象。当选择不直接在Item实体上的东西时,这是有用的,因为Linq for Entities使用延迟加载。我假设你之后,只是选择你的每个项目的第一张或默认图片。它看起来像这样:
_db.Items.Where(i => i.Status == 0)
.Select(i => new { Picture = i.Pictures.FirstOrDefault(), Item = i} )
.ToList();
正如Arnold所提到的,查询实际上是急于加载第一个项目。不需要. include .
根据更新的问题进行更新一般来说,最好不要将各种不必要的东西传递给视图。此外,上面的查询在选择中创建了一个匿名对象,该对象不能传递给视图。相反,为您的视图创建一个特定的模型。也许像这样:
ItemWithPicture.cs
public class ItemWithPicture
{
public int ItemID { get; set; }
public string Name{ get; set; }
public string Status{ get; set; }
public string PictureFilename{ get; set; }
public string PictureFilepath{ get; set; }
}
控制器public ActionResult Lager()
{
var model = _db.Items.Where(i => i.Status == 0).Select(i => new { Picture = i.Pictures.FirstOrDefault(), Item = i} ).Select(i => new {
ItemID = i.Item.ItemID,
Name = i.Item.Name,
Status = i.Item.Status,
PictureFilename = i.Picture != null ? i.Picture.Filename : null,
PictureFilepath = i.Picture != null ? i.Picture.Filepath : null
}).ToList();
return View(model);
}
视图@model IEnumerable<SomeNamespace.ItemWithPicture>
<div>
@foreach(var item in Model){
<ul>
<li>
<span class="icon">
<img src="@item.Filepath"/>
</span>
</li>
<li><span class="text">@item.Name</span></li>
<li><span class="text">@item.Status</span></li>
</ul>
}
</div>