簡體   English   中英

如何在Include中使用FirstOrDefault

[英]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>

在我看來,我想結合使用FilepathFilename來將其用於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM