U bevindt zich nu op een technische pagina over de software Mercator. Deze pagina bevat specifieke informatie die bestemd is voor professionals van de software Mercator. Wenst u naar algemenere informatie over Mercator door te gaan?


   Deze vraag niet meer stellen

Gebruik van de RowsEnumerable-extensie getypeerd op DataTable

0000003102     -      03-06-2024

Mercator gebruikt 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 een enkele dataset te verkrijgen (het equivalent van een enkele DataTable). 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.Zselect.

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.