Объединение двух выбранных показателей для извлечения данных из БД - PullRequest
0 голосов
/ 13 апреля 2020

Я немного запутался в проблеме и не знаю, как ее решить. Итак, проблема в следующем. У меня есть два Models ( ReportElement, ReportDefinition ) и один ViewModel ( ReportElementDefinitionVM )

Модель определения отчета

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; }
    }

Модель ReportElement

public partial class IzvjestajElementi
    {
        public int IzvjestajElementiId { get; set; }
        public int? IzvjestajDefinicijaId { get; set; }
        public string Element { get; set; }
        public string ElementVrijednosti { 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 IzvjestajDefinicija IzvjestajDefinicija { get; set; }
    }

И ReportElementDefinitionVM

public class GenerisaniIzvjestajiVM
    {
        public int IzvjestajiGenerisaniId { get; set; }
        public int? IzvjestajDefinicijaId { get; set; }
        public int? IzvjestajXsdshemaiId { get; set; }
        public string ShemaXSD { 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; }
        public string Elementi { get; set; }
        public string ElementiVrijednosti { get; set; }

    }

И сейчас у меня есть один Select статус, который принимает значение от ReportDefinition и ReportElementDefinitionVM

 public ListaSveVM UcitajIzvjestaj()
        {
            var listaFromDb = _context.IzvjestajDefinicija.Where(x => x.Status == 1).ToList().OrderByDescending(x => x.IzvjestajDefinicijaId);
            var listaM = new List<GenerisaniIzvjestajiVM>();
            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,
                    IzvjestajXsdshemaiId = i.IzvjestajXsdshemaiId,
                    ShemaXSD = i.IzvjestajXsdshemai.Shema,
                }).ToList();


            var lista = "";
            lista = JsonConvert.SerializeObject(data, Newtonsoft.Json.Formatting.None);
            var listaVM = new ListaSveVM();
            listaVM.sve = lista;
            return listaVM;
        }

И сейчас я хочу взять два свойства из ReportElement, которое (Element, ElementValue) будет отображаться в моем View, и пока я создаю что-то вроде этого:

 var elementi = _context.IzvjestajElementi.Where(x => x.Status == 1).OrderBy(x => x.IzvjestajDefinicijaId)
                .Select(i => new GenerisaniIzvjestajiVM()
                {
                    Elementi = i.Element,
                    ElementiVrijednosti = i.ElementVrijednosti
                }).ToList();

И когда я передаю elementi, я получаю ошибку

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

Severity    Code    Description Project File    Line    Suppression State
Error   CS1503  Argument 2: cannot convert from 'System.Collections.Generic.List<IZ.Model.VM.GenerisaniIzvjestajiVM>' to 'Newtonsoft.Json.JsonConverter'

И я также пытаюсь создать другую ViewModel, чтобы объединить все данные из этих две модели, но я не могу получить данные. Извините за длинный пост, но проблема очень сложная, и я описываю проблему как можно лучше. Кто-нибудь знает, как решить эту проблему, я был бы очень благодарен.

Обновление

IzvjestajElementi.cs

using System;
using System.Collections.Generic;

namespace IZ.Model.DBModels
{
    public partial class IzvjestajElementi
    {
        public int IzvjestajElementiId { get; set; }
        public int? IzvjestajDefinicijaId { get; set; }
        public string Element { get; set; }
        public string ElementVrijednosti { 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 IzvjestajDefinicija IzvjestajDefinicija { get; set; }
    }
}

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

var data = _context.IzvjestajDefinicija.Where(x => x.Status == 1).OrderByDescending(x => x.IzvjestajDefinicijaId)
                .Select(i => new IzvjestajElementiVM()
                {
                    IzvjestajDefinicijaId = i.IzvjestajDefinicijaId,
                    KratkiNazivDefinicijeI =
                    (_context.IzvjestajDefinicija.Where(x => x.IzvjestajDefinicijaId == i.IzvjestajDefinicijaId && x.Status == 1).FirstOrDefault()).KratkiNaziv,
                    Naziv = i.Naziv,
                    Opis = i.Opis,
                    ShemaXSD = i.IzvjestajXsdshemai.Shema,
                }).ToList();

            var elementi = _context.IzvjestajElementi.Where(x => x.Status == 1).OrderBy(x => x.IzvjestajDefinicijaId)
                .Select(i => new IzvjestajElementiVM()
                {
                    Elementi = i.Element,
                    ElementiVrijednosti = i.ElementVrijednosti
                }).ToList();

Когда я передаю element в

lista = JsonConvert.SerializeObject(data, elementi);

Я получаю ошибку

Ошибка CS1503 Аргумент 2: невозможно преобразовать из 'System. Collections.Generi c .List 'в' Newtonsoft. Json .Formatting '

Мне нужно что-то вроде этого

var data = _context.IzvjestajDefinicija.Where(x => x.Status == 1).OrderByDescending(x => x.IzvjestajDefinicijaId)
                .Select(i => new IzvjestajElementiVM()
                {
                    IzvjestajDefinicijaId = i.IzvjestajDefinicijaId,
                    KratkiNazivDefinicijeI =
                    (_context.IzvjestajDefinicija.Where(x => x.IzvjestajDefinicijaId == i.IzvjestajDefinicijaId && x.Status == 1).FirstOrDefault()).KratkiNaziv,
                    Naziv = i.Naziv,
                    Opis = i.Opis,
                    ShemaXSD = i.IzvjestajXsdshemai.Shema,
                    Elementi = i.Elementi,
                    ElementiVrijednosti = i.ElementiVrijednosti
                });.ToList();

Я хочу отобразить Elementi и ElementiVrijednosti в виде данных. Elementi и ElementiVrijednosti не содержатся в IzvjestajDefinicija только в IzvjestaElementiVM я не могу назначить. Поэтому я хочу отобразить Elementi и Elementi vrijednosti в моем Datatable. Проверьте изображение ниже.

enter image description here

using System;
using System.Collections.Generic;
using System.Text;

namespace IZ.Model.VM
{
    public class IzvjestajElementiVM
    {
        public int IzvjestajElementiId { get; set; }
        public int? IzvjestajDefinicijaId { get; set; }
        public int? IzvjestajXsdshemaId { get; set; }
        public int? IzvjestajTipId { get; set; }
        public string Naziv { get; set; }
        public string Opis { get; set; }
        public string Izvjestaj { get; set; }   
        public byte Status { get; set; }
        public string KorisnikUnosa { get; set; }
        public string KorisnikAzurirao { get; set; }
        public string NazivXmlfajla { get; set; }
        public string ShemaXSD { get; set; }
        public string KratkiNazivDefinicijeI { get; set; }
        public string Elementi { get; set; }
        public string ElementiVrijednosti { get; set; }

    }
}

Ответы [ 2 ]

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

Вы можете использовать Join() для объединения _context.IzvjestajElementi с data первым.

   var data = _context.IzvjestajDefinicija.Where(x => x.Status == 1).OrderByDescending(x => x.IzvjestajDefinicijaId)
                .Select(i => new IzvjestajElementiVM()
                {
                  IzvjestajDefinicijaId = i.IzvjestajDefinicijaId,
                  KratkiNazivDefinicijeI = (_context.IzvjestajDefinicija.Where(x => x.IzvjestajDefinicijaId == i.IzvjestajDefinicijaId && x.Status == 1).FirstOrDefault()).KratkiNaziv,
                  Naziv = i.Naziv,
                  Opis = i.Opis,
                  ShemaXSD = i.IzvjestajXsdshemai.Shema,
                }).ToList();

            var elementi = _context.IzvjestajElementi.Where(x => x.Status == 1).OrderBy(x => x.IzvjestajDefinicijaId).Join(data,
      post => post.IzvjestajDefinicijaId,
      meta => meta.IzvjestajDefinicijaId,
      (post, meta) => new { Post = post, Meta = meta })
                .Select(i => new IzvjestajElementiVM()
                {
                    IzvjestajDefinicijaId =  i.Meta.IzvjestajDefinicijaId,
                    KratkiNazivDefinicijeI = i.Meta.KratkiNazivDefinicijeI,
                    Naziv = i.Meta.Naziv,
                    Opis = i.Meta.Opis,
                    ShemaXSD = i.Meta.ShemaXSD,
                    Elementi = i.Meta.Elementi,
                    ElementiVrijednosti = i.Meta.ElementiVrijednosti,
                }).ToList();

            var lista = JsonConvert.SerializeObject(elementi);
1 голос
/ 14 апреля 2020

Если вы просто хотите сериализовать оба объекта, вы можете просто объединить оба, используя, например, анонимный тип . ( tuple , KeyValuePair или любой другой способ, вероятно, будет работать):

lista = JsonConvert.SerializeObject(new {data, elementi});

Учитывая, что два объекта кажутся одинаковыми List<IzvjestajElementiVM>, вы, вероятно, могли бы объедините их вместе, сделав что-то вроде этого:

var result = data.Union(elementi); //note, this will work better if you omit .ToList() from data and elementi - linq is lazily invoked
lista = JsonConvert.SerializeObject(result.ToList());

Затем, по-видимому, ваши модели фактически связаны через свойства навигации (и я предполагаю, что вы используете EF Core), так что вы потенциально можете .Include() IzvjestajDefinicija во второе выражение:

var elementi = _context.IzvjestajElementi.Include(e => e.IzvjestajDefinicija).Where(x => x.Status == 1).OrderBy(x => x.IzvjestajDefinicijaId)
        .Select(i => new IzvjestajElementiVM()
        {
            //report definition properties
            IzvjestajDefinicijaId = i.IzvjestajDefinicija.IzvjestajDefinicijaId,
            KratkiNazivDefinicijeI =                    (_context.IzvjestajDefinicija.Where(x => x.IzvjestajDefinicijaId == i.IzvjestajDefinicijaId && x.Status == 1).FirstOrDefault()).KratkiNaziv,
            Naziv = i.IzvjestajDefinicija.Naziv,
            Opis = i.IzvjestajDefinicija.Opis,
            ShemaXSD = i.IzvjestajDefinicija.IzvjestajXsdshemai.Shema,
            // report elements
            Elementi = i.Element,
            ElementiVrijednosti = i.ElementVrijednosti
        }).ToList();

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

UPD

Учитывая ваши модельные отношения, очень вероятно, что у вас будет много ReportElements, соответствующих одному ReportDefinition. Я могу предложить вам сгруппировать по ReportDefinition, но как вы хотите представить элементы - будет соответствовать вашим конкретным c требованиям:

var elementi = _context.IzvjestajElementi
        .Include(e => e.IzvjestajDefinicija)
        .Where(x => x.Status == 1)
        .GroupBy(g=>g.IzvjestajDefinicija) // group by parent entity, access it through Key property 
        .Select(i => new IzvjestajElementiVM()
        {
            //report definition properties
            IzvjestajDefinicijaId = i.Key.IzvjestajDefinicijaId,
            KratkiNazivDefinicijeI = (_context.IzvjestajDefinicija.Where(x => x.IzvjestajDefinicijaId == i.Key.IzvjestajDefinicijaId && x.Status == 1).FirstOrDefault()).KratkiNaziv,
            Naziv = i.Key.Naziv,
            Opis = i.Key.Opis,
            //ShemaXSD = i.IzvjestajDefinicija.IzvjestajXsdshemai.Shema,
            // report elements
            Elementi = i.FirstOrDefault().Element, // I don't know enough of your code base to be able to project the List<IzvjestajElementi> into anything meaningful here
            ElementiVrijednosti = i.FirstOrDefault().ElementVrijednosti // i is a List<IzvjestajElementi> - it's your call what to do with it here. you probably don't want FirstOrDefault() here - it's just a demo
        })
        .OrderBy(x => x.IzvjestajDefinicijaId)
        .ToList();
...