2014-03-15 4 views
1

У меня есть два объекта для элементов и изображений. Каждый элемент может иметь несколько изображений, но я хочу вернуть только одно изображение каждого элемента, когда перечисляю элементы.Как использовать FirstOrDefault внутри Include

класс Item

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 
} 

класс Picture

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="@[email protected]"/> 
      </span> 
     </li> 
     <li><span class="text">@item.Name</span></li> 
     <li><span class="text">@item.Status</span></li> 
    </ul> 
} 
</div> 

И на мой взгляд, я хочу, чтобы объединить Filepath и Filename использовать его для СРК img «s. Но я не уверен, как это сделать.

ответ

2

Предполагаю, что вы используете Linq для сущностей. Include указывает связанные объекты для включения в результаты запроса. Это полезно при выборе чего-то, что не относится к объекту Item, поскольку Linq для Entities использует ленивую загрузку. То, что я предполагаю, что вам нужно, - это только выбор первого или по умолчанию изображения на каждом из ваших предметов. Это будет выглядеть примерно так:

_db.Items.Where(i => i.Status == 0) 
     .Select(i => new { Picture = i.Pictures.FirstOrDefault(), Item = i}) 
     .ToList(); 

Update Как отметил Арнольд, запрос на самом деле стремится загрузки первого пункта. В этом нет необходимости. Включить.

Обновление по обновленному вопросу Как правило, это лучший дизайн, чтобы не передавать все виды ненужной вещи в представление. Кроме того, указанный выше запрос создает анонимный объект в элементе 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> 
+0

Вам не нужно даже в 'Include' потому, что вы с нетерпением Извлечение первое изображение. –

+0

Я пробовал этот код, но не работал для меня. Возможно, я не очень хорошо объяснил. Я отредактировал вопрос, поэтому теперь он содержит больше кода. –

+0

Я обновил свой ответ соответственно – Andreas

Смежные вопросы