Problem z indekserem

Problem z indekserem
Michał Warmuz
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 253
0

Cześć mam dwie klasy :)

Pracownik:

Kopiuj
    public class Pracownik
    {
        public long Id { get; private set; }
        public string Kod { get; private set; }
        public string Imię { get; private set; }
        public string Nazwisko { get; private set; }
        public string ImięNazwisko { get; private set; }
        public ICollection<PracHistoria> Historia { get; private set; }
        public PracHistoria Last => Historia.LastOrDefault();

        protected Pracownik() { }

        public Pracownik(string imie, string nazwisko)
        {
            Imię = imie;
            Nazwisko = nazwisko;
            ImięNazwisko = imie + " " + nazwisko;
            Kod = String.Format("{0:D5}", Id);
            Historia = new List<PracHistoria>();
        }
    }

PracHistoria

Kopiuj
    public class PracHistoria
    {
        public long Id { get; private set; }
        public DateTime Aktualnosc { get; private set; }
        public long PracownikId { get; private set; }
        public Pracownik Pracownik { get; private set; }

        protected PracHistoria() { }

        public PracHistoria(DateTime aktualnosc, long pracownikId)
        {
            Aktualnosc = aktualnosc;
            PracownikId = pracownikId;
        }

    }

jak napisać indekser aby w klasie Program mógłbym użyć takiej składni :)

Kopiuj
            ApplicationDbContext dbContext = new ApplicationDbContext();

            var p = dbContext.Pracownicy.Include(x=>x.Historia).FirstOrDefault();

            Console.WriteLine(p.Historia[DateTime.Now]);

próbowałem w klasie PracHistoria napisać coś takiego ale nie pomaga :/

Kopiuj
        public PracHistoria this[DateTime now]
        {
            get
            {
                if (Aktualnosc == now)
                {
                    return this;
                }
                else return null;
            }
        }
AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
1

próbowałem w klasie PracHistoria napisać coś takiego ale nie pomaga :/

No pewnie, że nic magicznie nie pomoże
Próbujmy rozwikłać lekki chaos.

  1. Na mój nos indekser wyłuskujący PracHistoria powinien być w Pracowniku (mniej czy bardziej bezpośrednio), wygląda jakbyś siłował się inaczej.
  2. masz lekki nadmiar pól, IdPracownika już jest w Pracowniku itd...
  3. indekser formalnie pisze się, jak napisałeś, ale wnętrze to samo się nie zrobi. Chyba trzeba się przejść po wszystkich rekordach Historia w Pracowniku (użytkowo - implementacyjnie to po bazie), szukajac dat nierównościami a nie równością, jak próbujesz. Ciekawym przypadkiem będzie (na ile się wczuwam) jak pracownik na tylko rekord główny, tj nie posiada Historii
Michał Warmuz
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 253
0

Dodałem indekser do klasy Pracownik

Kopiuj
        public PracHistoria this[DateTime now]
        {
            get
            {
                return Historia.FirstOrDefault(x => x.Aktualnosc.Date == now.Date);
            }
        }

oraz dzięki temu umożliwiło mi to pobrać Historię pracownika w klasie program tak :)

Kopiuj
            Console.WriteLine(p[DateTime.Now].Aktualnosc);

nie jest na razie super rozwiązanie ale na razie pomogło rozwiązać problem z indeserem kiedy Historia nie jest pusta :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.