sql >> Databáze >  >> RDS >> Mysql

Sloučit podřízená/nadřazená data s neznámým počtem sloupců

Po mnoha dnech práce na tom se mi podařilo tento problém vyřešit sám. Udělal jsem následující:

V mé původní podřízené třídě pak MemberCode a ElementCode vytvoří jedinečný klíč, který v podstatě udává, jaký byl název sloupce. Takže jsem to udělal o krok dále a přidal "Název_sloupce", takže jsem měl

public class Child
{
        public int MemberCode { get; set; }   //Composite key
        public int ElementCode { get; set; }  //Composite key
        public string Column_Name { get; set; }  //Unique.  Alternative Key
        public Object Data { get; set; }
}

To se samozřejmě odrazilo i v mé databázové tabulce.

Můj SQL pro extrakci dat pak vypadal takto;

select  p.UniqueID, p.LoadTime, p.reference, c.MemberCode, c.ElementCode , c.column_name, c.Data 
from parent as p, child as c
where p.UniqueID = c.UniqueID 
//aditional filter criteria
ORDER BY p.UniqueID, MemberCode, ElementCode

řazení podle UniqueID jako první je zásadní pro zajištění správného pořadí záznamů pro pozdější zpracování.

Použil bych dynamic a ExpandoObject() k uložení dat.

Takže iteruji výsledek, abych převedl výsledek sql do této struktury následovně;

List<dynamic> allRecords = new List<dynamic>();  //A list of all my records
List<dynamic> singleRecord = null;  //A list representing just a single record

bool first = true;   //Needed for execution of the first iteration only
int lastId = 0;      //id of the last unique record

foreach (DataRow row in args.GetDataSet.Tables[0].Rows)
{
    int newID = Convert.ToInt32(row["UniqueID"]);  //get the current record unique id   

    if (newID != lastId)  //If new record then get header/parent information
    {
        if (!first)
            allRecords.Add(singleRecord);   //store the last record
        else
            first = false;

        //new object
        singleRecord = new List<dynamic>();

        //get parent information and store it
        dynamic head = new ExpandoObject();
        head.Column_name = "UniqueID";
        head.UDS_Data = row["UniqueID"].ToString();
        singleRecord.Add(head);

        head = new ExpandoObject();
        head.Column_name = "LoadTime";
        head.UDS_Data = row["LoadTime"].ToString();
        singleRecord.Add(head);

        head = new ExpandoObject();
        head.Column_name = "reference";
        head.UDS_Data = row["reference"].ToString();
        singleRecord.Add(head);                    
    }

    //get child information and store it.  One row at a time
    dynamic record = new ExpandoObject();

    record.Column_name = row["column_name"].ToString();
    record.UDS_Data = row["data"].ToString();
    singleRecord.Add(record);

    lastId = newID;   //store the last id
}
allRecords.Add(singleRecord);  //stores the last complete record

Poté mám své informace dynamicky uloženy plochým způsobem, který jsem požadoval.

Dalším problémem byl ObjectListView, který jsem chtěl použít. Toto nemohlo přijmout takové dynamické typy.

Takže jsem měl informace uložené ve svém kódu, jak jsem chtěl, ale stále jsem je nemohl zobrazit, jak bylo požadováno.

Řešením bylo použít variantu ObjectListView známý jako DataListView . Toto je v podstatě stejný ovládací prvek, ale může být vázán daty. Další alternativou by také bylo použití DatagridView, ale chtěl jsem se držet ObjectListView z jiných důvodů.

Nyní jsem tedy musel převést svá dynamická data na zdroj dat. Udělal jsem to následovně;

DataTable dt = new DataTable();            
foreach (dynamic record in allRecords)
{
    DataRow dr = dt.NewRow();
    foreach (dynamic item in record)
    {
        var prop = (IDictionary<String, Object>)item;
        if (!dt.Columns.Contains(prop["Column_name"].ToString()))
        {
            dt.Columns.Add(new DataColumn(prop["Column_name"].ToString()));
        }

        dr[prop["Column_name"].ToString()] = prop["UDS_Data"];
    }
    dt.Rows.Add(dr);
}

Pak jednoduše přiřadím svůj zdroj dat k DataListView, vygeneruji sloupce a hej, teď mám dynamická data extrahovaná, sloučená a zobrazená, jak potřebuji.




  1. SQL UPDATE:Naučte se, jak aktualizovat hodnoty v tabulce

  2. ZF2 dezinfikuje proměnné pro dotazy DB

  3. Master High Availability Manager (MHA) se zhroutil! Co teď dělám?

  4. Jak mohu vybrat nejdelší „řetězec“ z tabulky při seskupování