[英]How to use FirstOrDefault inside Include
我有兩個實體用於物品和圖片。 每個項目可以有多張圖片,但是當我列出這些項目時,我只想返回一張圖片。
物品類別
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);
}
我從控制器收到此錯誤
包含路徑表達式必須引用在類型上定義的導航屬性。 使用虛線路徑作為參考導航屬性,使用“選擇”運算符作為集合導航屬性。
視圖是強類型的
@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。
根據更新的問題進行更新通常,最好不要將各種不必要的東西傳遞給視圖。 同樣,上面的查詢在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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.