NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Petr Novotný:24.2.2018 11:59

Ahojte, potřeboval bych vytvořit funkci, která bere na vstupu Dictionary<string, object> a podle toho vyhledá v databázi entitu, u které bude schodovat název vlastnosti a jeho hodnota s hodnotami uvedenými v Dictionary (string => properta, object => value)
Jednoduše by tedy člověk mohl zavolat funkci findOneBy, předat mu parametry a bylo by to.
Zatím jsem zkoušel něco takového:

Dictionary<string, object> parameters = new Dictionary<string, object>();
parameters["name"] = "Grade 5";
parameters["id"] = 5;

var query = Context.Grades.Select(u => u);

foreach (KeyValuePair<string, object> entry in parameters)
{
    query = query.Where(u => u.GetType().GetProperty(entry.Key).GetValue(u, null).Equals(entry.Value));
}

return query.SingleOrDefault();

jenom je tam problém, že u posledního řádku u return dostanu chybu

System.NotSup­portedExcepti­on: 'LINQ to Entities does not recognize the method 'System.Object GetValue(System­.Object, System.Object[])' method, and this method cannot be translated into a store expression.'

Nevíte prosím někdo, jak jinak by se to dalo řešit prosím ?

 
Odpovědět
24.2.2018 11:59
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Petr Novotný
Jan Vargovský:24.2.2018 15:41

Tohle musíš řešit na úrovni aplikace. Tohle v databázi neuděláš. Takže:

var query = Context.Grades.ToList();

Tím zajistíš, že si stáhneš data do aplikace a filtrování už děláš na klientovi.

Jak tam chainuješ to Where, tak to ten DB provider neumí zpracovat, protože neví jak zkonvertovat GetValue z reflexe na část SQL dotazu.

 
Nahoru Odpovědět
24.2.2018 15:41
Avatar
Odpovídá na Petr Novotný
Marian Benčat:24.2.2018 22:16

Jde si vygenerovat expression na základě toho, co potřebuješ, ale není to rozhodně nic pro začátečníka :-)

Microsoft LINQ

snad nedostanu banan za linnk na eshop...

zavolat ToList() nad DBSetem je spolehlivý způsob jak si mimimálně zlikvidovat veškerý performance serveru / aplikace garbage collectorem - ještě ideálně, pokud je to per request DB Context a pokaždém requestu se zahodí identity mapa.

V tom horším případě je to pád aplikace kvůli paměti, nebo tahání celé databáze do paměti.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
24.2.2018 22:16
Totalitní admini..
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Marian Benčat
Jan Vargovský:24.2.2018 23:25

Vzhledem ke struktuře toho kódu tipuju, že si jen zkouší jak dělat sofistikovanější věci s ORM. Nevím odkud jsi vydedukoval, že je to webová aplikace. Každopádně s tebou souhlasím, že to je naivní řešení. Ale říct mu, aby si generoval vlastní expression, když nedokázal vyřešit tohle, mi přišlo jako cesta do hrobu :D

 
Nahoru Odpovědět
24.2.2018 23:25
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.