Archtektura DTO, Repo,... a "dynamické data" rubrika: Programování: .Net

Zdravím ve spolek,
potřebuji radu :)
Máme architekturu:
- DAL/Entity Framework
- Repositories
- Facades
- WebAPI
Tenký klient běží jako WPF Desktop MVVM.
Data putují z repozitářů přes WebAPI až na klienta ve formě DTO.
Problém:
Je požadavek, aby na formulářích v datagridech bylo možné skrývat/zobrazovat sloupce dle výběru.
Současně toto skrytí/zobrazení musí udělat to, že SQL dotaz na databázi bude obsahovat pouze výčet sloupců dle výběru a současně data posílané na klienta budou také jen s vybranými sloupci.
Modelová situace:
- tabulka partnerů se sloupci: id, nazev, ulice, adresa, psc
- formulář ve WPF s datagridem a zobrazenými všemi 5 sloupci
- vygenerovaný SQL "SELECT id, nazev, ulice, adresa, psc FROM ...."
- uživatel si ve formu skryje sloupce id a adresa, dotaz tedy vygeneruje "SELECT nazev, ulice, psc FROM ...."
Tato vlastnost by mělá být napříč systémem. Tedy jakýkoliv form s datagridem by měl umožňovat toto dynamické skládání SQL a dynamické skládání dat (DTO).
Otázka:
- je toto "rozumně" realizovatelné pomocí uvedené architektury?
- jak by jste to řešili třeba i jiným způsobem?
Díky

/**
Toto není odpověď na hlavní otázku v tématu,
ale jen poznámka k diskuzi s pilif, kterou
jsem potřeboval zformátovat a proto ji napsal
jako samostatný příspěvek.
**/
Jak ukládat do tabulky tak, aby šlo snadno zobrazit jak vypadala v libovolném čase její historie:
Předpokládejme, že tabulka má sloupec id, který je PK.
- Přidám si sloupec "platnost" (datetime), který značí od kdy je tento údaj platný.
- Sloupci id zruším PK.
- Pokud insertuji tak do "platnost" nastavím aktuální datum a čas.
- Neupdatuji, pokud potřebuji změnit nějaké pole v záznamu, tak tam starý záznam nechám a vytvořím nový se stejným id a aktuálním datumem+časem
- Pokud potřebuji vidět jak aktuálně vypadá tabulka, tak si vytvořím dotaz, který pro každé id vybere záznam s nejvyšším datumem+časem v sloupci platnost.
- Pokud potřebuji vědět jak tabulka vypadala v čase T tak si vytvořím dotaz, který pro každé id vybere záznam s nejvyšším datumem+časem v sloupci platnost, které je menší T. Prostě novější změny ignoruji.
- pokud bych potřeboval i mazat, tak ještě do db přidám nějaký sloupec "smazano" a to časové razítko v "platnost" mi říká odkdy je sloupec smazaný.
Jak to souvisí s požadavkem na stránkování "tak jak vypadalo v okamžiku zobrazení první stránky"?
a. V okamžiku zobrazení první stránky si uložím aktuální datum a čas (třeba do URL)
b. Při přechodu na další stránky už nelistuji v aktuálním stavu tabulky, ale v tom historickém, který platil v okamžiku zobrazení první stránky.
PS: Z hlediska rychlosti a snadného psaní dotazů bývá lepší si udělat dva sloupce "platnost_od" a "paltnost_do". Ale to na principu řešení celkem nic nemění, je to jen cache a rozbití nějaké normální formy.
PS2: Dělat to jen kvůli stránkování mi přijde hodně zbytečné, nicméně pokud by zadavatel na tomto systému stránkování trval tak mi to rozhodně přijde lepší než ukládání všech PK.
PS3: Často se to používá v nějakým databázích právních předpisů, kdy mě pro každý případ zajímá jak právo vypadalo v okamžiku "spáchání činu" a jaké změny přišly potom je mi jedno.
Pro zobrazení všech 9 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře