• تبدیل DataTable به  List
تبدیل DataTable به List
1395/10/03 - 11:45:36 // MVC 5 & 6 // 0 نظر // 8135 بازدید

اگر شما از ADO.NET تابحال استفاده کرده باشید، با Datatable به طور قطع سر و کار داشته اید. حال وضعیتی را فرض کنید که دیتا در Controller از طریق قواعد ADO.NET درون یک DataTable قرار گرفته و حال شما باید آنرا به IEnumerAble تبدیل و به صورت عادی مشابه یک List یا یک Object مشابه آن از آن استفاده کنید.

بسمه تعالی

اگر شما از ADO.NET تابحال استفاده کرده باشید، با Datatable به طور قطع سر و کار داشته اید. حال وضعیتی را فرض کنید که دیتا در Controller از طریق قواعد ADO.NET درون یک DataTable قرار گرفته و حال شما باید آنرا به IEnumerAble تبدیل و به صورت عادی مشابه یک List یا یک Object مشابه آن از آن استفاده کنید.

برای پیاده سازی این سناریو در زبانهای C# یا VB.NET سه روش مفروض است.

 
  1. Using a Loop.
  2. Using LINQ.
  3. Using a Generic Method.

حال این سه روش را یک به یک در یک وضعیت فرضی مورد بررسی قرار میدهیم.

 

فرض کنید یک Model با وضعیت زیر مفروض است.
 

public class Student

 {

  public int StudentId { get; set; }

      public string StudentName { get; set; }

  public string Address { get; set; }

      public string MobileNo { get; set; }

 

حال چون دیتابیس به معنای واقعی وجود ندارد، این DataTable را به صورت فرضی از طریق کدنویسی پر میکنیم.

  DataTable dt = new DataTable("Student");

      dt.Columns.Add("StudentId", typeof(Int32));

  dt.Columns.Add("StudentName", typeof(string));

      dt.Columns.Add("Address", typeof(string));

  dt.Columns.Add("MobileNo", typeof(string));

     //Data

 dt.Rows.Add(1, "Manish", "Hyderabad","0000000000");

     dt.Rows.Add(2, "Venkat", "Hyderabad", "111111111");

 dt.Rows.Add(3, "Namit", "Pune", "1222222222");

 dt.Rows.Add(4, "Abhinav", "Bhagalpur", "3333333333"); 
 

حال به بررسی سه روش موجود میپردازیم.

 

-استفاده از Loop

 

1. public void StudentList()

2. {

3. // DataTable dt = new DataTable("Branches");

4. DataTable dt = new DataTable("Student");

5. dt.Columns.Add("StudentId", typeof(Int32));

6. dt.Columns.Add("StudentName", typeof(string));

7. dt.Columns.Add("Address", typeof(string));

8. dt.Columns.Add("MobileNo", typeof(string));

9. //Data

10. dt.Rows.Add(1, "Manish", "Hyderabad", "0000000000");

11. dt.Rows.Add(2, "Venkat", "Hyderabad", "111111111");

12. dt.Rows.Add(3, "Namit", "Pune", "1222222222");

13. dt.Rows.Add(4, "Abhinav", "Bhagalpur", "3333333333");

14.

15. List<Student> studentList = new List<Student>();

16. for (int i = 0; i < dt.Rows.Count; i++)

17. {

18. Student student = new Student();

19. student.StudentId = Convert .ToInt32 (dt.Rows[i]["StudentId"]);

20. student.StudentName = dt.Rows[i]["StudentName"].ToString();

21. student.Address = dt.Rows[i]["Address"].ToString();

22. student.MobileNo = dt.Rows[i]["MobileNo"].ToString();

23. studentList.Add(student);

24. }

} 
 
 
 
استفاده از Linq
 

public void StudentListUsingLink()

 {

 // DataTable dt = new DataTable("Branches");

 DataTable dt = new DataTable("Student");

 dt.Columns.Add("StudentId", typeof(Int32));

 dt.Columns.Add("StudentName", typeof(string));

 dt.Columns.Add("Address", typeof(string));

 dt.Columns.Add("MobileNo", typeof(string));

 //Data

 dt.Rows.Add(1, "Manish", "Hyderabad", "0000000000");

 dt.Rows.Add(2, "Venkat", "Hyderabad", "111111111");

 dt.Rows.Add(3, "Namit", "Pune", "1222222222");

 dt.Rows.Add(4, "Abhinav", "Bhagalpur", "3333333333");

 List<Student> studentList = new List<Student>();

 studentList = (from DataRow dr in dt.Rows

 select new Student()

 {

 StudentId = Convert .ToInt32 (dr["StudentId"]),

 StudentName = dr["StudentName"].ToString(),

 Address = dr["Address"].ToString(),

 MobileNo = dr["MobileNo"].ToString()

 }).ToList();


}

 
 3- استفاده از یک متد Generic 
 
 

1. private static List<T> ConvertDataTable<T>(DataTable dt)

2. {

3. List<T> data = new List<T>();

4. foreach (DataRow row in dt.Rows)

5. {

6. T item = GetItem<T>(row);

7. data.Add(item);

8. }

9. return data;

10. }

11. private static T GetItem<T>(DataRow dr)

12. {

13. Type temp = typeof(T);

14. T obj = Activator.CreateInstance<T>();

15.

16. foreach (DataColumn column in dr.Table.Columns)

17. {

18. foreach (PropertyInfo pro in temp.GetProperties())

19. {

20. if (pro.Name == column.ColumnName)

21. pro.SetValue(obj, dr[column.ColumnName], null);

22. else

23. continue;

24. }

25. }

26. return obj;

} 
 
 

از متد تهیه شده به شکل زیر استفاده میشود.

List< Student > studentDetails = new List< Student >();

studentDetails = ConvertDataTable< Student >(dt); 
 
 

روش Generic Method در کل ساده تر و پیشرفته تر به نظر می رسد. از لحاظ Performance این روش بهینه تر و در ضمن ساده تر میباشد. اگر یک متد Static تهیه کنید و در بدنه پروژه همه DataTable ها را به صورت اتوماتیک به List تبدیل کنید، دیگر نیازی به درگیر شدن هرباره با این روالها را نخواهید داشت، ولی در صورت علاقه به استفاده از مفاهیم Pure ADO.NET به صورت سنتی در پروژه های خود، مواظب باشید قواعد طوری پیاده سازی شود که Unit Testing قابل پیاده سازی باشد . در این مواقع به پیاده سازی SOLID به عنوان یک Design Pattern بیشتر دقت کنید.

 
 
علی کلاهدوزان
معرفی نویسنده : علی کلاهدوزان

سلام بر دوستان ،
شاید رایج است به عنوان پروفایل کاربر ، چند خطی راجع به خودم بنویسم ، ولی وضعیت کاری و سوابق من با یک جستجوی ساده در گوگل مشخص خواهد شد ، لذا سرتان را با مطالب بی مورد به درد نیاورم بهتر است . اگر نکته خاصی لازم بود بدانید در قسمت "ایلیا سافت در یک نگاه" به احتمال زیاد یافت خواهد شد . جزئیات بیشتر را سوال کنید ، آدرس ایمیل Ali@Kolahdoozan.com همیشه جوابگوی شماست .امیدوارم از مطالب سایت استفاده کرده باشید . شاد و پیروز باشید .

امتیاز به مطلب
           
برچسب ها
DataTable List 
نظرات کاربران
ارسال نظر