7

SQLの再帰を使用して作成したデータセットがあります。

Parent        UserId   Child     Reporting_To_UserId   Depth        id
Aditya         13     Abhishek     4                   0            13
Abhishek       4      Saurabh      6                   1            16
Abhishek       4      Mohinder     8                   1            17
Mohinder       8      Mohammad     14                  2            18
Saurabh        6      Rahul        1                   2            11
Saurabh        6      Amitesh      5                   2            12

次に、次のようなXMLを生成します。-

 <Person name="Aditya" User_Id="13">

    <Person name="Abhishek" User_Id="4">

           <Person name="Mohinder" User_id="8">
               <Person name="Mohammad" User_id="14"/>
           </Person>         

           <Person name="Saurabh" User_Id="6">
              <Person name="Rahul" User_Id="1"/>
              <Person name="Amitesh" User_Id="5"/>
           </Person>

     </Person>

 </Person>

データセットの親と子の関係を使用して階層XMLを作成したいと思います。

4

3 に答える 3

1

再帰的なLINQで実行できると思いますが、それでも正しく記述する方法を理解する必要があるため、再帰的な方法を使用したソリューションを次に示します。

最初に、メソッドを宣言します(私はで検索を実行しましたNameが、で実行することもできますId):

public static IEnumerable<XElement> BuildXML(string Parent, DataTable dt)
{
    string filter = string.Format("[Parent] = '{0}'", Parent);
    return from x in dt.Select(filter)
            select new XElement("Person",
                        new XAttribute("Name", x["Child"]),
                        new XAttribute("User_Id", x["Reporting_To_UserId"]),
                        BuildXML(x["Child"].ToString(), dt)
                    );
}

次に、親要素を使用して呼び出します(一番上の行を追加しました。そうしないと、クエリがより複雑になります)。

var dt = new DataTable();
dt.Columns.AddRange(new[] {
    new DataColumn("Parent"),
    new DataColumn("UserId"),
    new DataColumn("Child"),
    new DataColumn("Reporting_To_UserId"),
    new DataColumn("Depth"),
    new DataColumn("id")
});
dt.Rows.Add(new object[] { "", 0, "Aditya", 13, 0, 12 });
dt.Rows.Add(new object[] {"Aditya", 13, "Abhishek", 4, 0, 13});
dt.Rows.Add(new object[] { "Abhishek", 4, "Saurabh", 6, 1, 16 });
dt.Rows.Add(new object[] { "Abhishek", 13, "Mohinder", 8, 1, 17 });
dt.Rows.Add(new object[] { "Mohinder", 8, "Mohammad", 14, 2, 18 });
dt.Rows.Add(new object[] { "Saurabh", 6, "Rahul", 1, 2, 11 });
dt.Rows.Add(new object[] { "Saurabh", 6, "Amitesh", 5, 2, 12 });

var result = BuildXML("", dt);

これIEnumerable<XElement>で、文字列に変換するには、次のように実行できます。

var xml = result.
            Select(e => e.ToString()).
            Aggregate((current, next) => current + next);
于 2012-12-05T09:36:58.297 に答える
1

次のコードを利用できると思います。

 protected void Page_Load(object sender, EventArgs e)
    {
        DataSet ds = new DataSet();
        string connStr = @"Data Source=MY-PC\SQLExpress;Initial Catalog=DataDB;User Id=ME;Password=YourPassword;Trusted_Connection=True;";
        using (SqlConnection conn = new SqlConnection(connStr))
        {
            string sql = "Select MenuID, Text,Description, ParentID from UserInfo";
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            da.Fill(ds);
            da.Dispose();
        }
        ds.DataSetName = "UserInfos"; //You can start directly from here as you have the dataset just mantain Parent and Child ID Proper
        ds.Tables[0].TableName = "UserInfo";
        DataRelation relation = new DataRelation("ParentChild",
         ds.Tables["UserInfo"].Columns["MenuID"],
         ds.Tables["UserInfo"].Columns["ParentID"], true);

        relation.Nested = true;
        ds.Relations.Add(relation);  //XmlDataSource1 is any source of xml you can have this in file also
        XmlDataSource1.Data = ds.GetXml(); //Here Dataset will automatically generate XML for u based on relations added

    }
于 2012-12-05T09:51:02.857 に答える
0

データセットでDataRelationを作成できます。

DataRelation relation = new DataRelation("ParentChild",
         ds.Tables["UserInfo"].Columns["MenuID"],
         ds.Tables["UserInfo"].Columns["ParentID"], true);
**relation.Nested = true;**
ds.Relations.Add(relation);  //

「ネストされた」という帰属は非常に重要です。

Makeyuan

于 2014-01-27T09:09:16.277 に答える