Kdy může metoda Count() najednou způsobit zdánlivě nesmyslnou chybu

26. 11. 2017, Vladimír Klaus, přečteno 359x

ASP.NET/C#

A je to tu zase. Několik let funguje nějaký kód bez nejmenších problémů a když ho je trochu upravíte, tak začne vykazovat zcela nesmyslnou chybu. Měl jsem jednoduchou proměnnou, kterou jsem pak připojil k hlavnímu dotazu.

var HledaciPodminka = " WHERE NeniAktualni='False'";

Po čase jsem potřeboval přidat další podmínku:

var HledaciPodminka = " WHERE NeniAktualni='False' AND BU='" + App.BU + "' ";

Co je App.BU? To je docela jedno, ale typ je to "dynamic". Díky tomu se i HledaciPodminka stala "dynamic". Na tom asi není, resp. nemělo by být nic fatálního. Ovšem, když pak toto zavoláte, tak to není dobré...

var selectQueryString = "SELECT TOP 300 * FROM SHIPMENTShipments "
  + HledaciPodminka;
var data = db.Query(selectQueryString);
var PocetPolozek = data.Count();

Prostě to skončí chybou:

Je to docela šílené, protože co jiného, než string byste měli předávat jako parametr Query. Bohužel díky "dynamic" na začátku je vše následující také "dynamic" a tak i data jsou "dynamic" a u nich nelze volat metodu Count(), ale jen se ptát na vlastnost Count.

Řešení je naštěstí zcela jednouché - všude, kde máte var a dává to smysl, nahraďte za string. V tu chvíli se i proměnná data změní z dynamic na IEnumerable<dynamic> a vše bude fungovat tak jako dřív.

Viz též: