I have Entity as below.
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
}
}
I query data from database and convert to Entity. For getDataMasterMenu1() I'm using two Loop. For getDataMasterMenu2() I'm using one Loop and linq. For getDataMasterMenu3() I want to use only linq, but I don't know how to do and is it possible?
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;
}
}
All you have to do is nest your 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;
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.