Gebruik van de RowsEnumerable-extensie getypeerd op DataTable

0000003102     -      04-01-2025

Mercator beschikt over de getypeerde Api.Zselect methode om het resultaat van een extractie rechtstreeks uit de SQL-database te verkrijgen in de vorm van een lijst met objecten. Deze methode kan echter alleen worden gebruikt om slechts maximaal 3 datasets te verkrijgen (het equivalent van 3 DataTables). Als u meerdere datasets met typen wilt verkrijgen, moet u deze MercatorExtensions-extensie gebruiken :

Zoom
public static IEnumerable<T> RowsEnumerable<T>(this DataTable dt, Func<DataRow, bool> predicate = null)

 

Hier is het SQL-script met twee queries die twee DataTables produceren :

select c_id,c_nom,c_cat1,sum(tot_bas_fb) as tot_ca from CLI left join PIEDS_V on cli.c_id=pieds_v.id_cli where ... group by c_id,c_nom,c_cat1
select f_id,f_nom,f_cat2,sum(tot_bas_fb) as tot_ca from FOU left join PIEDS_A on fou.f_id=pieds_a.id_fou where ... group by f_id,f_nom,f_cat2

 

We maken deze twee klassen om de verkregen resultaten te typeren :

Zoom
public class CliAndCa
{
    public string c_id { get; set; }
    public string c_nom { get; set; }
    public string c_cat1 { get; set; }
    public double? tot_ca { get; set; }
}

public class FouAndCa
{
    public string f_id { get; set; }
    public string f_nom { get; set; }
    public string f_cat2 { get; set; }
    public double? tot_ca { get; set; }
}

 

Merk op dat in deze twee klassen, tot_ca een nullable double (double?) is, aangezien de left join een nullwaarde voor deze kolom kan produceren.

De basiscode voor het produceren van twee lijsten getypeerd volgens deze klassen is als volgt :

Zoom
string reqSql = "select c_id,c_nom,c_cat1,sum(tot_bas_fb) as tot_ca from CLI left join PIEDS_V on cli.c_id=pieds_v.id_cli where ... group by c_id,c_nom,c_cat1 \r\n"
              + "select f_id,f_nom,f_cat2,sum(tot_bas_fb) as tot_ca from FOU left join PIEDS_A on fou.f_id=pieds_a.id_fou where ... group by f_id,f_nom,f_cat2";
DataSet ds = Api.Zselect(MercatorController.Globals.RepData, reqSql);
if (ds != null)
{
    List<CliAndCa> listCliAndCa = ds.Tables[0].RowsEnumerable<CliAndCa>().ToList();
    List<FouAndCa> listFouAndCa = ds.Tables[1].RowsEnumerable<FouAndCa>(dr => dr["f_id"].ToString().StartsWith("A")).ToList();
}

 

Om de lijst met leveranciers samen te stellen, geven we ook een predicaat mee als parameter, zodat alleen leveranciers waarvan de F_ID begint met "A" in aanmerking worden genomen. Dit predicaat filtert op de DataRows in de DataTable.

De ontwerpprincipes van de klasse zijn identiek aan die van de getypeerde methode Api.ZselectTupels en basistypen kunnen ook worden gebruikt. (minimale versie van MercatorTunnel 11.0.303)

In tegenstelling tot de getypeerde Api.Zselect methode, zijn de gegevens hier gesplitst: de informatie bestaat zowel in de DataSet als in de lijsten die door de extensie zijn gemaakt. Er is geen koppeling tussen de twee (dus een wijziging in de List<T> heeft geen effect op de DataSet, en omgekeerd).

Het doel van deze uitbreiding is om notaties te verlichten door de noodzaak te elimineren om System.ConvertTo... keer op keer te herhalen op DataRows-elementen.



Functionele cookies: Cookies die nodig zijn voor het gebruik van de website en voorkeurscookies. Ze bevatten geen persoonsgegevens. (Meer informatie)

Analytische cookies: Verzamelen van statistieken met betrekking tot het gedrag van internetgebruikers. (Meer informatie)

Marketingcookies: Om bezoekers op verschillende websites te volgen voor advertentiedoeleinden. (Meer informatie)