Budowanie typu obiektu na podstawie informacji z bazy danych

0

Hej,

zalozmy ze mamy menu w jakims barze i sobie sa tam pozycje:
piwo

  • lech, 5zl
    -tyskie, 5zl
  • kozel 6zl
    dodatki do piwa
  • sok malinowy 2zl
  • sok wisniowy 3zl

Zalozmy ze chcialem wykorzystac do przechowywania danych jakas baze danych (skorzystalem z sqlite i biblioteki dapper)
Moja tabela przedstawia sie tak:

id category_id name price parent_id
1 Null Piwo Null 1
-- ------------------ ------------- ----------- -----------------
2 1 Lech 5 Null
-- ------------------ ------------- ----------- -----------------
3 1 Tyskie 5 Null
-- --------------- ------------------ ----------- -----------------
4 Null Dodatki do piwa Null 2
-- ------------------ ------------- ----------- -----------------
5 2 s.malinowy 2 Null
-- ------------------ ------------- ----------- -----------------
6 2 s.wisniowy 3 Null

A wiec zrobilem sobie kategorie PIWO z ktorej wychodza lechy tyskie itd i kategorie DODATKI DO PIWA z ktorej wychodza soki.
Teraz mam sobie w c# 2 obiekty:

{
    public class BaseMenuItem
    {
        public string name { get; set; }
        public uint parent_id {get; set;}
    }

    public class MenuItem : BaseMenuItem
    {
        public ushort category_id { get; set; }
        public decimal price { get; set; }
    }
}

Jak widac obiekt MenuItem (zalozylem sobie ze bedzie to konkretne piwo np lech dziedziczy po BaseMenuItem ktory jest rodzajem produktu (jakies piwo, jakis dodatek do piwa itd).
Mam metode ktora laduje dane:

        public List<**JAKIS_TYP**> loadSqData()
        {
            IDbConnection conn = getConnection();
            using (conn)
            {
                var data = getConnection().Query<**JAKIS_TYP**>("select * from Menu", new DynamicParameters());
                return data.ToList();
            }
        }

Pytanie: Jak to zrobic, zeby typ byl przydzielany dynamicznie tzn jak jest zaciagniety w liscie obiekt "jakies piwo" to zeby typ zwracany byl BaseMenuItem a jak jest np. "Lech" to zeby typ byl MenuItem. Pewnie moglbym zrobic 2 metody ladowania i 2 zapytania z roznymi typami albo dwie tablice ale chyba nie o to w tym chodzi;-)

Pytanie2: Do takiego menu, owa tabela ktora napisalem jest ok czy struktura jest lipna i proponujecie jakas inna.

Dalej bede sobie budowal tyle przyciskow ile kategorii a po kliknieciu w przycisk z kategoria bede wyswietlal konkretne nazwy np. piw. Dlatego musze jakos rozrozniac kategorie np. Piwa od konkretnego rodzaju np. Lech.

2

Dapper Method using generics

public static IEnumerable<T> ListReader<T>(string SQL, string DbName = "TEST")
{
    using (IDbConnection cmd = new SqlConnection(ConfigurationManager.ConnectionStrings[DbName].ConnectionString))
    {
        return cmd.Query<T>(SQL).ToList();
    }
}

Przerób sobie pod siebie.

PS.
Najprawdopodobniej najpierw musisz poprawić "błąd logiczny" w bazie danych.

  1. Dlaczego ParentId piwa jest takie same jak Id?
  2. Dlaczego nie zrobisz osobnej tabeli z kategoriami?
0

No to mam dwie tabele :) pierwsza ma tylko 3 pola id, nazwa i category_id (piwo, dodatki do piwa itd).
Druga ma id category_id name price.
Metoda dziala poprawnie, jak by ktos mial z tym klopot to wrzucam kod:

        public SqliteController()
        {
            
        }

        public IEnumerable<T> loadSqData<T>(string SQL)
        {
            IDbConnection conn = getConnection();
            using (conn)
            {
                var data = conn.Query<T>(SQL);//"select * from MenuItem");//, new DynamicParameters());
                return data;
            }
        }

        private string loadConnectionString(string id = "SQLite")
        {
            return ConfigurationManager.ConnectionStrings[id].ConnectionString;
        }

        private IDbConnection getConnection()
        {
            return new SQLiteConnection(loadConnectionString());
        }

    }

Dzieki AdamWox.

1 użytkowników online, w tym zalogowanych: 0, gości: 1