2017-06-29 23 views
0

私はエンティティを以下のように持っています。DataTableを{Object、List {Object}}を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()では2つのLoopを使用しています。 getDataMasterMenu2()では、ループと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; 
    } 
} 
+0

?このコードはすべて、単一の 'dbContext.MasterMenu.Include(m => m.MasterMenuChildOfParent).ToList()'で置き換えることができます。 DataTablesを使用することにより、メモリも2倍になります。 –

+0

Mr.Panagiotis Kanavosありがとうございます。私はORMを勉強します。 – akkapolk

+0

子テーブルに余分な列があります。親テーブルをクローンし、ParentIDカラムを追加した場合は、1つのlinqでそれを行うことができます。 – jdweng

答えて

3

あなたがしなければならないのは、巣あなたのLINQです:あなたはこのためにORMを使用していないのはなぜ

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; 
} 
+0

これは私の予想です。どうもありがとうございました。 – akkapolk

関連する問題