如何在Include中使用FirstOrDefault

本文关键字:FirstOrDefault Include | 更新日期: 2023-09-27 17:50:30

我有两个条目和图片实体。每个项目可以有多张图片,但是当我列出项目时,我只想返回每个项目的一张图片。

项目类

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>

在我看来,我想将FilepathFilename结合使用,用于img的src。但是我不知道该怎么做。

如何在Include中使用FirstOrDefault

我假设你正在使用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>