ASP.NET MVC Передаю результат LINQ запроса во View
В контроллере создаю linq запрос и передаю его во view View видит i но не видит i.Flat
public ActionResult Index()
{
var info = (from f in db.Flats
join d in db.Datas on f.IndicatorId equals d.IndicatorId
select new
{
Flat = f.Address,
Indicator = f.IndicatorId,
Date = d.Date,
Value = d.Value
}).ToList();
ViewBag.Info = info;
return View();
}
}
Ответы (2 шт):
Попробуйте использовать как тут в ответе
var myobj = RouteValueDictionary(i);
и доступ к свойствам myobj["Flat"]
преобразование в массив свойств динамического объекта
Вы используете анонимный тип - в этом проблема.
Если лень создавать класс-модель, то можно обойтись применением динамики.
Написал linq-код в синтаксисе методов, т. к. в данном случае это проще.
var info = db.Flats
.Join(db.Datas, f => f.IndicatorId, d => d.IndicatorId,
(f, d) =>
{
dynamic exp = new ExpandoObject();
exp.Flat = f.Address;
exp.Indicator = f.IndicatorId;
exp.Date = d.Date;
exp.Value = d.Value;
return exp;
});
ViewBag.Info = info;
Но лучше использовать класс-модель.
Типы свойств укажите, какие нужны. В примере они сделаны object.
public class Info
{
public object Flat { get; set; }
public object Indicator { get; set; }
public object Date { get; set; }
public object Value { get; set; }
}
А дальше код запроса отличается от вашего лишь наличием типа Info в селекте:
var info = (from f in db.Flats
join d in db.Datas on f.IndicatorId equals d.IndicatorId
select new Info
{
Flat = f.Address,
Indicator = f.IndicatorId,
Date = d.Date,
Value = d.Value
});
ViewBag.Info = info;
Ещё более правильный способ: не использовать ViewBag, а передавать модель во вью.
var info = (from f in db.Flats
join d in db.Datas on f.IndicatorId equals d.IndicatorId
select new Info
{
Flat = f.Address,
Indicator = f.IndicatorId,
Date = d.Date,
Value = d.Value
});
return View(info); // обратите внимание на параметр
В представлении добавляем вверху строку с указанием нашей модели:
@model IEnumerable<AspNetCore.Models.Info>
Естественно, используйте ваше пространство имён.
Так выглядит код прохода по коллекции:
@foreach (var item in Model)
{
<tr>
<td>@item.Flat</td>
<td>@item.Indicator</td>
<td>@item.Date</td>
<td>@item.Value</td>
</tr>
}
