Отображение имени поля в представлении с использованием Linq - PullRequest
1 голос
/ 30 января 2020

Я хочу отобразить имя свойства поля в представлении (отчете). Модель:

public class Report
    {
        [Display(Name ="Total Attendance")]
        public int Attendance { get; set; }

        [Display(Name = "Total Offering")]
        [DataType(DataType.Currency)]
        public double Amount { get; set; }

        [Display(Name = "District Name")]
        public int LocationId { get; set; }


        [ForeignKey("LocationId")]
        public Location Location { get; set; }
        [Display(Name = "Weekly Service")]
        public int WeeklyServiceId { get; set; }

        [ForeignKey("WeeklyServiceId")]
        [Display(Name = "Weekly Service")]
        public WeeklyService WeeklyService { get; set; }

        public DateTime? Sdate { get; set; }
        public DateTime? Edate { get; set; }

        public string UsherName { get; set; }
        public string LocationName { get; set; }
    }

Контроллер:

[HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult Report(Report model)
        {
            var startDate = model.Sdate;
            var endDate = model.Edate;
            var QueryResult = (from pay in _context.PaymentRecords.Include(p=>p.Location).Include(p=>p.WeeklyService)
                               //join a in _context.Locations on pay.LocationId equals a.Id
                               //join c in _context.WeeklyServices on pay.WeeklyServiceId equals c.Id
                               where (pay.DepositDate.Date >= startDate)
                               where (pay.DepositDate.Date <= endDate)
                               group pay by new { pay.LocationId,pay.WeeklyServiceId} into g
                               orderby g.Key.LocationId
                               select new Report
                               {
                                   LocationId= g.Key.LocationId,
                                   Attendance = g.Sum(x => x.Attendance),
                                   Amount = g.Sum(x => x.Amount),
                                   WeeklyServiceId =g.Key.WeeklyServiceId

                               });

            return View("Report", QueryResult);
        }

Просмотр / Отчет

<table class="table table-striped table-bordered" id="myTable">
    <thead class="thead-dark">
        <tr>
            <th>SN</th>
            <th>@Html.DisplayNameFor(model => model.Location)</th>
            <th>@Html.DisplayNameFor(model => model.Attendance)</th>
            <th>@Html.DisplayNameFor(model => model.Amount)</th>
            <th>@Html.DisplayNameFor(model => model.WeeklyService)</th>



        </tr>
    </thead>
    <tbody>
        @if (Model.Count() > 0)
        {
         int c = 0;
            foreach (var item in Model)
            {
                c++;
                <tr>
                    <td>@c</td>
                    <td>@Html.DisplayFor(modelItem =>  item.Location.Name)</td>
                    <td>@Html.DisplayFor(modelItem=>item.Attendance)</td>
                    <td>@item.Amount.ToString("C")</td>
                    <td>@Html.DisplayFor(modelItem=>item.WeeklyService.Name)</td>


                </tr>
            }
            }

            else
            {

            }
    </tbody>
</table>

Результат вышеперечисленного enter image description here Обратите внимание, что Location - это модель, в которой свойство Name имеет свойство, а также WeeklyService. Но если я изменю данные таблицы на LocationId и WeeklyServiceId, он отобразит результаты с идентификатором. Но я хочу, чтобы он отображал имя местоположения и WeeklyService вместо их идентификаторов. enter image description here

1 Ответ

2 голосов
/ 30 января 2020

Вот пример того, что мы имеем в виду в комментариях. Вы неправильно инициализируете объект отчета.

[HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Report(Report model)
    {
        var startDate = model.Sdate;
        var endDate = model.Edate;
        var QueryResult = (from pay in _context.PaymentRecords.Include(p=>p.Location).Include(p=>p.WeeklyService).ToList()
                           //join a in _context.Locations on pay.LocationId equals a.Id
                           //join c in _context.WeeklyServices on pay.WeeklyServiceId equals c.Id
                           where (pay.DepositDate.Date >= startDate)
                           where (pay.DepositDate.Date <= endDate)
                           group pay by new { pay.LocationId,pay.WeeklyServiceId} into g
                           orderby g.Key.LocationId
                           select new Report
                           {
                               LocationId= g.Key.LocationId,
                               Attendance = g.Sum(x => x.Attendance),
                               Amount = g.Sum(x => x.Amount),
                               WeeklyServiceId =g.Key.WeeklyServiceId
                               Location = g.Select(pp => pp.Location).First() // This is what you are missing
                               WeeklyService  = g.Select(pp => pp.WeeklyService ).First()// Also this

                           });

        return View("Report", QueryResult);
    }

Расположение и недельный сервис недействительны. Они никогда не инициализируются.

Я удивлен, что вы не получите исключение Null Ref. Вы никогда не упоминали один. Я говорю это из-за (item => item.Location.Name) в вашем представлении. Надеюсь, что это поможет.

Обратите внимание, осторожно с оценкой на стороне клиента и EF core 3 https://github.com/dotnet/efcore/issues/17878, https://github.com/dotnet/efcore/issues/17068

Также взято из документации : https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#linq запросы больше не оцениваются клиентом

...