将两个Linq查询数据放入两个单独的数据表列中

时间:2014-05-21 13:25:16

标签: c# linq datatable multiple-columns

我是linq的新手,在这个问题上被困了几天。下面是我的例子的xml。

<

                    <ItemGroupData ItemGroupOID="IG_TABLE_MODALITYTABLE" ItemGroupRepeatKey="1" TransactionType="Insert">
                        <ItemData ItemOID="I_TABLE_MODAL_DATE_TABLE" Value="2014-05-01" />
                        <ItemData ItemOID="I_TABLE_MODAL_TYPE_TABLE" Value="1" />
                    </ItemGroupData>
                    <ItemGroupData ItemGroupOID="IG_TABLE_MODALITYTABLE" ItemGroupRepeatKey="2" TransactionType="Insert">
                        <ItemData ItemOID="I_TABLE_MODAL_DATE_TABLE" Value="2014-05-02" />
                        <ItemData ItemOID="I_TABLE_MODAL_TYPE_TABLE" Value="2" />
                    </ItemGroupData>

我想要实现的是将ItemData区分为DATE和TYPE,然后将其放入已创建的数据表列中。下面是我当前的尝试,它只连接行而不是将数据放入两个创建的列中。非常感谢你的帮助。任何意见是极大的赞赏。欢呼声。

            DataTable modDt = new DataTable();
            modDt.Columns.Add(new DataColumn("Date", typeof(string)));
            modDt.Columns.Add(new DataColumn("Type", typeof(string))); //changed to string?

            var document = XDocument.Load("doc.xml");

            XNamespace nsSys = "http://www.cdisc.org/ns/odm/v1.3";

             //Get nodes separated by inner child element
             var values = document.Descendants(nsSys + "ItemData")
            .Where(t => t.Attribute("ItemOID").Value == "I_TABLE_MODAL_DATE_TABLE")
            .Select(x => x.Attribute("Value").Value);

             foreach (var item in values)
             {
                 modDt.Rows.Add(DateTime.ParseExact(item, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("MM/dd/yy"),null);
             }


             var typevalues = document.Descendants(nsSys + "ItemData")
             .Where(t => t.Attribute("ItemOID").Value == "I_TABLE_MODAL_TYPE_TABLE")
             .Select(x => x.Attribute("Value").Value);

             foreach (var item in typevalues)
             {
                 modDt.Rows.Add(null ,int.Parse(item));
             }

             foreach (DataRow row in modDt.Rows)
             {
                 string sessionDate = row["Date"].ToString();
                 string mod = row["Type"].ToString();

                 string xnatCli = mod + sessionDate;
                 Console.Write(xnatCli);
             }

             Console.Read();

1 个答案:

答案 0 :(得分:0)

您的代码中有一些假设,即I_TABLE_MODAL_DATE_TABLE和I_TABLE_MODAL_TYPE_TABLE将始终匹配。我发布的代码进行了额外的检查,以确保这是一个正确的假设。还对它们进行分组,以便为​​每个有效的ItemGroupData获取一行。如果缺少其中一个属性,则仅添加有效属性,如果两个属性都缺失则跳过该行。此外,如果有多个具有相同名称的属性,则代码只占用ItemGroupData中的最后一个。

var modDt = new DataTable();
modDt.Columns.Add(new DataColumn("Date", typeof(DateTime)));
modDt.Columns.Add(new DataColumn("Type", typeof(int))); 

var document = XDocument.Load("doc.xml");

XNamespace nsSys = "http://www.cdisc.org/ns/odm/v1.3";

//Get ItemData attributes group by the itemGroupData
var itemGroupDatas =
    document.Descendants(XName.Get("ItemGroupData", nsSys.NamespaceName))
            .Elements(XName.Get("ItemData", nsSys.NamespaceName))
            .Select(x => new
                {
                    itemOID = x.Attribute(XName.Get("ItemOID")),
                    value = x.Attribute(XName.Get("Value"))
                })

            .Where(
                x =>
                x.itemOID != null && x.value != null &&
                (x.itemOID.Value == "I_TABLE_MODAL_DATE_TABLE" ||
                 x.itemOID.Value == "I_TABLE_MODAL_TYPE_TABLE"))
            .GroupBy(x => x.itemOID.Parent.Parent, x => x);

foreach (var itemGroupData in itemGroupDatas)
{
    // record per each group
    var row = modDt.NewRow();
    foreach (var itemData in itemGroupData)
    {
        if (itemData.itemOID.Value == "I_TABLE_MODAL_DATE_TABLE")
        {
            DateTime date;
            if (DateTime.TryParse(itemData.value.Value, out date))
            {
                row["Date"] = date;
            }
        }
        if (itemData.itemOID.Value == "I_TABLE_MODAL_TYPE_TABLE")
        {
            int type;
            if (int.TryParse(itemData.value.Value, out type))
            {
                row["Type"] = type;
            }
        }
    }
    modDt.Rows.Add(row);
}
Console.ReadLine();