Выражение Linq в представлении Razor для доступа к дочернему свойству - как использовать вместо этого модель представления? - PullRequest
0 голосов
/ 22 декабря 2011

Сценарий:

Родительско-дочерние отношения между CustomerOrders и CustomerOrderItems в дБ.

И CustomerOrders, и CustomerOrderItems определены в автоматически сгенерированном dbml-классе Linq2Sql.

Код MVC:

У меня есть вид модели класса:

public class OrdersListViewModel
{
    public IEnumerable<CustomerOrder> CustomerOrders { get; set; }
    public PagingInfo PagingInfo { get; set; }
}

, который передает данные в частичное представление (интересует только данные CustomerOrders):

@model CallTracking.Domain.Concrete.CustomerOrder
<tr>
    <td>@Model.Auto_ID</td>
    <td>@Model.OrderTotal</td>
    <td>@string.Format("{0} {1}", Model.CustomerFirstName, Model.CustomerSecondName)</td>
    <td>@Model.Email</td>
    **<td>@Model.CustomerOrderItems.OrderByDescending(i => i.SalesPrice).FirstOrDefault().ItemName</td>**
</tr>

Это работает нормально, проблема в том, что я использовал выражение Linq для отображения элемента порядка наибольшего значения для каждой записи заказа, но я чувствую (и прочитал), что не должен использовать Linq в представлении и это должно быть свойство в модели представления, т.е.

public CustomerOrderItem HighestValueOrderItem { get; set; }

Именно в этот момент я застреваю - как и где мне установить это значение?

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

В модели CustomerOrder создать свойство с именем

private CustomerOrderItem _HighestValueOrderItem = null;
public CustomerOrderItem HighestValueOrderItem { 
get{
   if(this.CustomerOrderItems.Any() && _HighestValueOrderItem != null){
        _HighestValueOrderItem =  this.CustomerOrderItems.OrderByDescending(i => i.SalesPrice).FirstOrDefault();
        return  _HighestValueOrderItem;
   } else {
      return new CustomerOrderItem();
   }
}
}
1 голос
/ 22 декабря 2011

или получите это значение при создании DTO в контроллере

public class OrdersListViewModel
{
   public string CurrentItem {get;set;}
   public CustomerOrder[] CustomerOrders { get; set; }
   public PagingInfo PagingInfo { get; set; }
}

//and the controller action
var model = new OrdersListViewModel
                 {
                     CurrentItem = orders.OrderByDescending(i => i.SalesPrice).FirstOrDefault().ItemNumber,
                     CustomerOrders = orders.ToArray(),
                     PagingInfo = new PagingInfo(...)
                 };
return View(model);
...