簡體   English   中英

使用屬性查找值linq

[英]Using attributes to find value linq

我是LINQ初學者,需要一些幫助。 以下是rest查詢生成的XML的重要部分。

<FormData FormOID="F_TABLEOFMODAL_V20" OpenClinica:Version="v2.0" OpenClinica:Status="initial data entry">
    <ItemGroupData ItemGroupOID="IG_TABLE_MODALITYTABLE" ItemGroupRepeatKey="3" TransactionType="Insert">
        <ItemData ItemOID="I_TABLE_MODAL_DATE_TABLE" Value="2014-04-10" />
        <ItemData ItemOID="I_TABLE_MODAL_TYPE_TABLE" Value="4" />
    </ItemGroupData>
    <ItemGroupData ItemGroupOID="IG_TABLE_MODALITYTABLE" ItemGroupRepeatKey="1" TransactionType="Insert">
        <ItemData ItemOID="I_TABLE_MODAL_DATE_TABLE" Value="2014-04-01" />
        <ItemData ItemOID="I_TABLE_MODAL_TYPE_TABLE" Value="2" />
    </ItemGroupData>
    <ItemGroupData ItemGroupOID="IG_TABLE_MODALITYTABLE" ItemGroupRepeatKey="2" TransactionType="Insert">
        <ItemData ItemOID="I_TABLE_MODAL_DATE_TABLE" Value="2014-04-04" />
        <ItemData ItemOID="I_TABLE_MODAL_TYPE_TABLE" Value="1" />
    </ItemGroupData>
</FormData>

我想要得到的是ItemOID。 我的問題是是否有某種方法可以獲取所有ItemOID =“ I_TABLE_MODAL_DATE_TABLE”(ans:兩個日期)和ItemOID =“ I_TABLE_MODAL_TYPE_TABLE”(ans:兩個數字)的值。 下面的代碼有效,但這將ItemData用於第一個元素(稱為日期),然后將一個跳到第二個元素(類型)。

////Print out xml to use?
                    var doc = XDocument.Load(XmlReader.Create(streaming));

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

                    //loop through <ItemGroupData> to get both date and type value
                    //from each iteration
                    var items = from i in doc.Descendants(nsSys + "ItemGroupData")
                                select new
                            {
                                date = (string)i.Element(nsSys + "ItemData").Attribute("Value"),
                                type = (string)i.Descendants(nsSys + "ItemData").Skip(1).First().Attribute("Value")
                            };
                    //Catch here?

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

                    //add LINQ-to-XML query result to DataTable

                    foreach (var item in items)
                    {
                        //convert item.date string to DateTime  
                        //then convert it back to string with different format
                        modDt.Rows.Add(DateTime.ParseExact(item.date, "yyyy-MM-dd", CultureInfo.InvariantCulture)
                                       .ToString("MM/dd/yy"),
                                       int.Parse(item.type));
                    }

                    //Value of OC output
                    //1=mr,2=ct,3=pet,4=us,5=meg,6=ecg (put if statements before xnat rest ssh string)
                    for (int i = 0; i <= modDt.Rows.Count - 1; i++)
                    {
                        modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("1", "mr");
                        modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("2", "ct");
                        modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("3", "pet");
                        modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("4", "us");
                        modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("5", "meg");
                        modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("6", "ecg");
                    }

我已經開始編寫如下所示的一些代碼。 抱歉,無法將數據添加到數據表中。 但是,我要做什么的想法就在那里。

            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 itd = document.Descendants(nsSys + "ItemData")
               .Where(t => (string)t.Attribute("ItemOID") == "I_TABLE_MODAL_DATE_TABLE");

            var itds = itd.Attributes("Value").ToArray();

            foreach (var it in itds)
            {
                var subA = it.ToString();
                var subAA = subA.ToCharArray();
                var subB = subAA.Skip(9).Take(8).ToArray();

                string sub = new string(subB);
                var subBB = sub.Split('-').ToArray();
                string subC = subBB[1] + "/" + subBB[2] + "/" + subBB[0];
                foreach (DataRow dr in modDt.Rows)
                {
                    dr["Date"] = subC;  
                }

                Console.WriteLine(subC);                
            }

            var itt = document.Descendants(nsSys + "ItemData")
               .Where(t => (string)t.Attribute("ItemOID") == "I_TABLE_MODAL_TYPE_TABLE");

            var itty = itt.Attributes("Value").ToArray();

            foreach (var et in itty)
            {
                var subz = et.ToString();
                var subzz = subz.ToCharArray();
                var subx = subzz.Skip(7).Take(1).ToArray();
                string subxx = new string(subx);

                foreach (DataRow dt in modDt.Rows)
                {
                    dt["Type"] = subxx;
                }

                Console.WriteLine(subxx);
            }

            //for (int i = 0; i <= modDt.Rows.Count - 1; i++)
            //{
            //    modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("1", "mr");
            //    modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("2", "ct");
            //    modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("3", "pet");
            //    modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("4", "us");
            //    modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("5", "meg");
            //    modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("6", "ecg");
            //}

            foreach (DataRow row in modDt.Rows) // Loop over the rows.
            {
                string sessionDate = row["Date"].ToString();
                string mod = row["Type"].ToString();
                string drow = "aa" + sessionDate + "bb" + mod + "cc"; 
                Console.WriteLine(drow);
            }

            Console.Read();

非常感謝您的幫助和時間。 非常感謝。 干杯。

當前嘗試

            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);


            }

我試圖用單行代碼回答您的問題

var values = document.Descendants("ItemData")
           .Where(t => t.Attribute("ItemOID").Value == "I_TABLE_MODAL_DATE_TABLE")
           .Select(x => x.Attribute("Value").Value)

在此行之后,值集合將具有所有日期。 同樣可以應用於其他查詢。

更新:假設為連接數據庫到相關表准備了類FormDataContext,下面的解決方案使用linq到sql。

FormDataContext db = new FormDataContext();

[Table(Name = "FormData")]
public class FormData
{
        [Column]
        public DateTime Date;
        [Column]
        public int Type;
}

IEnumerable<FormData> values = document.Descendants("ItemGroupData").Select(t => { 
    return new FormData {
        FormDate = Convert.ToDateTime(t.XPathSelectElement("ItemData[@ItemOID='I_TABLE_MODAL_DATE_TABLE']").Attribute("Value").Value),
        Type = Convert.ToInt32(t.XPathSelectElement("ItemData[@ItemOID='I_TABLE_MODAL_TYPE_TABLE']").Attribute("Value").Value)
    }; 
});


foreach (FormData data in values) {
    db.Form.InsertOnSubmit(data);
}

db.SubmitChanges();

這只是將所需的兩個字段存儲到db的示例。 您可以根據需要調整示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM