簡體   English   中英

如何通過Linq將DataTable轉換為List {Object,List {Object}}

[英]How can I Convert DataTable to List{Object, List{Object}} by Linq

我有如下實體。

namespace Entity
{
    public class MasterMenu
    {
        public MasterMenuParent MasterMenuParent;
        public List<MasterMenuChildOfParent> MasterMenuChildOfParent;
    }

    public class MasterMenuParent
    {
        public string Id { get; set; }
        public string Name { get; set; }
    }

    public class MasterMenuChildOfParent
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public string ParentId { get; set; } //It's a foreign key that link to MasterMenuParent.Id
    }
}

我從數據庫查詢數據並轉換為實體。 對於getDataMasterMenu1(),我正在使用兩個Loop。 對於getDataMasterMenu2(),我正在使用一個Loop和linq。 對於getDataMasterMenu3(),我只想使用linq,但是我不知道該怎么辦,這可能嗎?

using Entity;
public partial class Test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        List<MasterMenu> list1 = getDataMasterMenu2();
        List<MasterMenu> list2 = getDataMasterMenu2();
        List<MasterMenu> list3 = getDataMasterMenu3();
    }

    //Using two Loop
    private List<MasterMenu> getDataMasterMenu1()
    {
        List<MasterMenu> result = new List<MasterMenu>();
        List<MasterMenuChildOfParent> tempMasterMenuChildOfParent = new List<MasterMenuChildOfParent>();
        DataTable dtMasterMenuParent = new DataTable(); //Assume: I already query data from database and then load to datatable that has field: ID, NAME
        DataTable dtMasterMenuChild = new DataTable(); //Assume: I already query data from database and then load to datatable that has field: ID, NAME, PARENT_ID
        for (int i1 = 0; i1 < dtMasterMenuParent.Rows.Count; i1++)
        {
            //Select Child Of Parent
            DataTable dtMasterMenuChildOfParent = (from DataRow dr in dtMasterMenuChild.Rows where dr["PARENT_ID"].Equals(dtMasterMenuParent.Rows[i1]["ID"]) select dr).CopyToDataTable();
            for (int i2 = 0; i2 < dtMasterMenuChildOfParent.Rows.Count; i2++)
            {
                tempMasterMenuChildOfParent.Add(new MasterMenuChildOfParent
                {
                    Id = dtMasterMenuChildOfParent.Rows[i2].Field<string>("ID"),
                    Name = dtMasterMenuChildOfParent.Rows[i2].Field<string>("NAME"),
                    ParentId = dtMasterMenuChildOfParent.Rows[i2].Field<string>("PARENT_ID"),
                });
            }

            result.Add(new MasterMenu
            {
                MasterMenuParent = (new MasterMenuParent
                {
                    Id = dtMasterMenuParent.Rows[i1].Field<string>("ID"),
                    Name = dtMasterMenuParent.Rows[i1].Field<string>("NAME")
                }),
                MasterMenuChildOfParent = tempMasterMenuChildOfParent
            });
        }
        return result;
    }

    //Using one Loop and linq
    private List<MasterMenu> getDataMasterMenu2()
    {
        List<MasterMenu> result = new List<MasterMenu>();
        DataTable dtMasterMenuParent = new DataTable(); //Assume: I already query data from database and then load to datatable that has field: ID, NAME
        DataTable dtMasterMenuChild = new DataTable(); //Assume: I already query data from database and then load to datatable that has field: ID, NAME, PARENT_ID
        for (int i1 = 0; i1 < dtMasterMenuParent.Rows.Count; i1++)
        {
            //Select Child Of Parent
            DataTable dtMasterMenuChildOfParent = (from DataRow dr in dtMasterMenuChild.Rows where dr["PARENT_ID"].Equals(dtMasterMenuParent.Rows[i1]["ID"]) select dr).CopyToDataTable();
            result.Add(new MasterMenu
            {
                MasterMenuParent = (new MasterMenuParent
                {
                    Id = dtMasterMenuParent.Rows[i1].Field<string>("ID"),
                    Name = dtMasterMenuParent.Rows[i1].Field<string>("NAME")
                }),
                MasterMenuChildOfParent = dtMenuChildOfParent.AsEnumerable().Select(row =>
                new MasterMenuChildOfParent
                {
                    Id = row.Field<string>("ID"),
                    Name = row.Field<string>("NAME"),
                    ParentId = row.Field<string>("PARENT_ID")
                }).ToList()
            });
        }
        return result;
    }

    //Using linq
    private List<MasterMenu> getDataMasterMenu3()
    {
        List<MasterMenu> result = new List<MasterMenu>();
        DataTable dtMasterMenuParent = new DataTable(); //Assume: I already query data from database and then load to datatable that has field: ID, NAME
        DataTable dtMasterMenuChild = new DataTable(); //Assume: I already query data from database and then load to datatable that has field: ID, NAME, PARENT_ID

        //How can I Convert DataTable to List{Object, List{Object}} by Linq

        return result;
    }
}

您所要做的就是嵌套您的LINQ:

private List<MasterMenu> getDataMasterMenu3() {
    var dtMasterMenuParent = new DataTable();
    var dtMasterMenuChild = new DataTable();

    var result = (from p in dtMasterMenuParent.AsEnumerable()
             join c in dtMasterMenuChild.AsEnumerable() on p.Field<string>("ID") equals c.Field<string>("PARENT_ID") into cj
             select new MasterMenu {
                 MasterMenuParent = new MasterMenuParent { Id = p.Field<string>("ID"), Name = p.Field<string>("NAME") },
                 MasterMenuChildOfParent = cj.Select(c => new MasterMenuChildOfParent {
                     Id = c.Field<string>("ID"),
                     Name = c.Field<string>("NAME"),
                     ParentId = c.Field<string>("PARENT_ID")
                 }).ToList()
             }).ToList();

    return result;
}

暫無
暫無

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

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