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 шт):

Автор решения: Aziz Umarov

Попробуйте использовать как тут в ответе

var myobj = RouteValueDictionary(i); 

и доступ к свойствам myobj["Flat"]

преобразование в массив свойств динамического объекта

→ Ссылка
Автор решения: Alexander Petrov

Вы используете анонимный тип - в этом проблема.

Если лень создавать класс-модель, то можно обойтись применением динамики.
Написал 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>
}
→ Ссылка