如何在Include中使用FirstOrDefault

时间:2014-03-15 22:13:51

标签: c# asp.net asp.net-mvc linq

我有两个实体用于物品和图片。 每个项目可以有多个图片,但我只想在列出项目时返回每个项目的一张图片。

项目类

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。 但我不确定该怎么做。

1 个答案:

答案 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>