Отображаемое имя указано в ID - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть две модели, которые связаны Foreign Key, и в моем представлении я хочу отобразить Имя, присвоенное ID Вот мое действие Servis, которое используется для извлечения данных из db

 public ListaSveVM UcitajIzvjestaj()
        {
            var listaFromDb = _context.IzvjestajDefinicija.Where(x => x.Status == 1).ToList().OrderByDescending(x => x.IzvjestajDefinicijaId);
            var listaM = new List<GenerisaniIzvjestajiVM>();

            foreach (var i in listaFromDb)
            {
                var novizv = new GenerisaniIzvjestajiVM();
                novizv.IzvjestajiGenerisaniId = i.IzvjestajDefinicijaId;
                novizv.KratkiNazivDefinicijeI = (_context.IzvjestajDefinicija.Where(x => x.IzvjestajDefinicijaId == i.IzvjestajDefinicijaId && x.Status == 1).FirstOrDefault()).KratkiNaziv;
                novizv.Naziv = i.Naziv;
                novizv.Opis = i.Opis;
                novizv.DatumKreiranja = i.DatumUnosa;
                novizv.DatumAzuriranja = i.DatumAzuriranja;
                novizv.IzvjestajXsdshemaiId = i.IzvjestajXsdshemaiId;               
                listaM.Add(novizv);
            }
            var lista = "";
            lista = JsonConvert.SerializeObject(listaM, Newtonsoft.Json.Formatting.None);
            var listaVM = new ListaSveVM();
            listaVM.sve = lista;
            return listaVM;
        } 

И в моем представлении у меня есть данные для отображения этих данных

 $(document).ready(function () {

        $('#tabela').dataTable({
            language: {
                buttons: {
                    copyTitle: 'Uspjeh',
                    copySuccess: {
                        _: '%d redova kopirano',
                        1: '1 red kopiran'
                    }
                },
                processing: "Upit se obrađuje...",
                search: "Pretraga&nbsp;:",
                lengthMenu: "_MENU_ redova",
                info: "Prikazano _START_  do _END_ od ukupno _TOTAL_ redova",
                infoEmpty: "Nema zapisa...",
                infoFiltered: "(filtrirano _MAX_ redova ukupno)",
                infoPostFix: "",
                loadingRecords: "Zapisi se učitavaju...",
                zeroRecords: "U tabeli je nula redova.",
                emptyTable: "Tabela je prazna!",
                   select: {
                    rows: {
                        _: "",
                        0: "",
                        1: ""
                    }
                },
                paginate: {
                    first: "Prvi",
                    previous: "<i class='fas fa-arrow-left'></i>",
                    next: "<i class='fas fa-arrow-right'></i>",
                    last: "Posljednji"
                },
                aria: {
                     sortAscending: ": ",
                    sortDescending: ": "
                }
            },
            order: [[0, 'dsc']],
            data: @Html.Raw(@Model.sve),
            columns: [
                {
                    data: "IzvjestajiGenerisaniId",
                    "width": 20,
                    "className": 'dt-body-center'
                },

                { data: "KratkiNazivDefinicijeI" },
                { data: "IzvjestajXsdshemaiId" },
                { data: "Naziv" },
                { data: "Opis" },
                {
                    data: "DatumKreiranja",
                    "mRender": function (data, type, full) {
                        return (moment(data).format("DD-MM-YYYY"));
                    }
                },
                {
                    data: "DatumAzuriranja",
                    "mRender": function (data, type, full) {
                        return (moment(data).format("DD-MM-YYYY"));
                    }
                },
            ]
        });   //kraj tabele

            var table = $('#tabela').DataTable();

            // Primjeni pretragu samo za odabrane kolone
            table.columns([1, 2, 3]).every(function () {
                var that = this;

                $('input', this.footer()).on('keyup change', function () {
                    if (that.search() !== this.value) {
                        that
                            .search(this.value)
                            .draw();
                    }
                });
            });
     });

Но он просматривает его отображающий идентификатор, и сейчас я хочу преобразовать этот идентификатор в имя. Я пытаюсь вставить мою модель

[Display(Name = "NameOfXSDSchema")]

Но это не работает. enter image description here

ОБНОВЛЕНИЕ

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

using System;
using System.Collections.Generic;

namespace IZ.Model.DBModels
{
    public partial class IzvjestajXsdshema
    {
        public IzvjestajXsdshema()
        {
            IzvjestajDefinicija = new HashSet<IzvjestajDefinicija>();
            IzvjestajiGenerisani = new HashSet<IzvjestajiGenerisani>();
        }

        public int IzvjestajXsdshemaiId { get; set; }
        public string Shema { get; set; }
        public byte Status { get; set; }
        public DateTime DatumUnosa { get; set; }
        public DateTime? DatumAzuriranja { get; set; }
        public string KorisnikUnosa { get; set; }
        public string KorisnikAzurirao { get; set; }
        public string HederXls { get; set; }

        public virtual ICollection<IzvjestajDefinicija> IzvjestajDefinicija { get; set; }
        public virtual ICollection<IzvjestajiGenerisani> IzvjestajiGenerisani { get; set; }
    }
}


using System;
using System.Collections.Generic;

namespace IZ.Model.DBModels
{
    public partial class IzvjestajDefinicija
    {
        public IzvjestajDefinicija()
        {
            IzvjestajElementi = new HashSet<IzvjestajElementi>();
            IzvjestajiGenerisani = new HashSet<IzvjestajiGenerisani>();
        }

        public int IzvjestajDefinicijaId { get; set; }
        public int? IzvjestajTipId { get; set; }
        public int? IzvjestajXsdshemaiId { get; set; }
        public string KratkiNaziv { get; set; }
        public string Naziv { get; set; }
        public string Opis { get; set; }
        public byte Status { get; set; }
        public DateTime DatumUnosa { get; set; }
        public DateTime? DatumAzuriranja { get; set; }
        public string KorisnikUnosa { get; set; }
        public string KorisnikAzurirao { get; set; }

        public virtual IzvjestajTip IzvjestajTip { get; set; }
        public virtual IzvjestajXsdshema IzvjestajXsdshemai { get; set; }
        public virtual ICollection<IzvjestajElementi> IzvjestajElementi { get; set; }
        public virtual ICollection<IzvjestajiGenerisani> IzvjestajiGenerisani { get; set; }
    }
}

И одна ViewModels, которую я использую для получения данных из него

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text;

namespace IZ.Model.VM
{
    public class GenerisaniIzvjestajiVM
    {
        public int IzvjestajiGenerisaniId { get; set; }
        public int? IzvjestajDefinicijaId { get; set; }
        public int? IzvjestajXsdshemaiId { get; set; }
        public string KratkiNazivDefinicijeI { get; set; }
        public string Naziv { get; set; }
        public string Opis { get; set; }
        public string Izvjestaj { get; set; }
        public DateTime DatumOd { get; set; }
        public DateTime DatumDo { get; set; }
        public string ImportedExcel { get; set; }
        public DateTime DatumKreiranja { get; set; }
        public byte Status { get; set; }
        public DateTime DatumUnosa { get; set; }
        public DateTime? DatumAzuriranja { get; set; }
        public string KorisnikUnosa { get; set; }
        public string KorisnikAzurirao { get; set; }
        public string NazivXmlfajla { get; set; }
    }
}

И сейчас IzvjestajXSDShemaId - это идентификатор дисплея в моем View, и я хочу отобразить имя (схема в модели IzvjestajXSDShema) в представлении insted из ID

1 Ответ

1 голос
/ 12 апреля 2020

Вы должны попытаться получить все свои данные из базы данных за один раунд (один запрос). В большинстве случаев это возможно и очень просто.

Добавьте поле IzvjestajXSDShema в модель представления и измените код на:

var _context = new DbContext();
var data = _context.IzvjestajDefinicija
    .Where(x => x.Status == 1)
    .OrderByDescending(x => x.IzvjestajDefinicijaId)
    .Select(i => new GenerisaniIzvjestajiVM()
    {
        IzvjestajiGenerisaniId = i.IzvjestajDefinicijaId,
        KratkiNazivDefinicijeI =
            (_context.IzvjestajDefinicija.Where(x => x.IzvjestajDefinicijaId == i.IzvjestajDefinicijaId && x.Status == 1).FirstOrDefault()).KratkiNaziv,
        Naziv = i.Naziv,
        Opis = i.Opis,
        DatumKreiranja = i.DatumUnosa,
        DatumAzuriranja = i.DatumAzuriranja,
        IzvjestajXsdshemaiId = i.IzvjestajXsdshemaiId,

        // Here we use navigation properties provided by your ORM to
        // bring the required field from other entity
        IzvjestajXSDShema = i.IzvjestajXsdshemai.Shema
    })
    .ToList();

var lista = JsonConvert.SerializeObject(data, Newtonsoft.Json.Formatting.None);

Есть несколько вещей, на которые следует обратить внимание в приведенном выше коде:

  1. Не звоните .ToList() до конца вашего запроса. Вызов ToList() запустит запрос и перенесет данные в память. Обычно это приносит больше данных, чем требуется.

  2. Используйте Свойства навигации для извлечения связанных данных. EF производит необходимые JOIN операции в конечном запросе для оптимального извлечения нужных вам данных.

  3. Ваша модель представления должна содержать все вещей, которые нужно отправить UI.

...