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.
Člen
Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
"x => x.param1 == 5 && x.param2 != null" apod.
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?
Pak ti doporučuji hledat/nastudovat Roslyn a CSharpCompilation. Je to celkem jednoduché.
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.Expressions namespacu, jako
například:
"FilterDescriptorCollectionExpressionBuilder" kterému se předají
Expression... ty lze vytvořit například pomocí:
Expression.Parameter(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(filtry například kvuli pravum).ForGrid(tenJSONObjekt);
coz se rozloší na Whery, Skipy, Taky atd.
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
Zobrazeno 9 zpráv z 9.