我有两个实体用于物品和图片。 每个项目可以有多个图片,但我只想在列出项目时返回每个项目的一张图片。
项目类
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。
但我不确定该怎么做。
答案 0 :(得分:2)
我假设你正在使用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。
根据更新的问题更新 一般来说,更好的设计是不要将各种不必要的东西传递给视图。此外,上面的查询在select中创建了一个匿名对象,该对象无法传递给视图。而是为您的视图制作一个特定的模型。也许是这样的:
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>