IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Vytvoření lambda výrazu ze stringu

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
švrčajs
Člen
Avatar
švrčajs:10.8.2017 12:37

Zdravím, mám takový menší problém, chci napsat metodu, která mi vrátí z listu vybrané položky, dle předaných argumentů, něco ve stylu:

public List<T> GetMany(string condition){

return this.lst.Where(condition).ToList<T>();

}

ale where nepřekouše string, tak se snažím převést string na Func<T, bool>, což se mi nedaří.

Nevíte někdo, jak by to šlo udělat, buď string přeparsovat na Func nebo nějaký jiný nápad ?

 
Odpovědět
10.8.2017 12:37
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na švrčajs
Ondřej Štorc:10.8.2017 13:06

Jak vypadá obsah toho stringu?

Nahoru Odpovědět
10.8.2017 13:06
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
švrčajs
Člen
Avatar
Odpovídá na Ondřej Štorc
švrčajs:10.8.2017 13:16

"x => x.param1 == 5 && x.param2 != null" apod.

Editováno 10.8.2017 13:16
 
Nahoru Odpovědět
10.8.2017 13:16
Avatar
zelvicek
Člen
Avatar
zelvicek:10.8.2017 13:25

Pokud to tedy chápu správně, condition je vlastně expression (=> anonymní funkce) a this.lst je IEnumerable<T>. A ty potřebuješ:

public List<T> GetMany(string condition)
{
        return this.lst.Where(Compile(condition)).ToList<T>();
}

Func<T,bool> Compile<T>(string code)
{
//dynamicka kompilace
}

Je to tak?

Editováno 10.8.2017 13:27
 
Nahoru Odpovědět
10.8.2017 13:25
Avatar
švrčajs
Člen
Avatar
Odpovídá na zelvicek
švrčajs:10.8.2017 13:31

V podstatě ano

 
Nahoru Odpovědět
10.8.2017 13:31
Avatar
zelvicek
Člen
Avatar
Odpovídá na švrčajs
zelvicek:10.8.2017 13:48

Pak ti doporučuji hledat/nastudovat Roslyn a CSharpCompilation. Je to celkem jednoduché.

 
Nahoru Odpovědět
10.8.2017 13:48
Avatar
Odpovídá na zelvicek
Marian Benčat:10.8.2017 15:28

Ani jedno z toho vůbec nemusí, toto jde a šlo ještě před roslynem.

Je ale pto to potřeba znát LINQ, Expressionama a stavbu LambdaExpression..

Existují pro to třídy přímo v System.Linq.Ex­pressions namespacu, jako například:
"FilterDescrip­torCollectionEx­pressionBuilder" kterému se předají Expression... ty lze vytvořit například pomocí:
Expression.Pa­rameter(source­.ElementType, "item")

atd.. Není to easy, ale jde to a jde to dobře.

My máme gridy, které nám zavolají endpoint - předají v něm nastavení filtru, orderingu, groupingu atp. A na zákaldě toho JSON objektu se pak sestaví LambdaExpression, který jde připojit třeba ke Queryablu..

Takže gridy máme absolutně bez práce.

db.data.Where(fil­try například kvuli pravum).ForGrid(ten­JSONObjekt);

coz se rozloší na Whery, Skipy, Taky atd.

Nahoru Odpovědět
10.8.2017 15:28
Totalitní admini..
Avatar
Odpovídá na švrčajs
Marian Benčat:10.8.2017 15:43

Dal bych ti sem kod, kde je videt jak se to dělá (celé je to možná tak 200řádek kodu - my už to ale máme vymakané), bohužel je zrovna toto kod, ktery spada do NDA :-)

Nahoru Odpovědět
10.8.2017 15:43
Totalitní admini..
Avatar
švrčajs
Člen
Avatar
švrčajs:13.8.2017 18:47

Nakonec jsem se rozhodl tahat to přímo z listu, bez využití metody GetMany..

 
Nahoru Odpovědět
13.8.2017 18:47
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 9 zpráv z 9.