반응형

C# DataTable을 객체 리스트(List)로 변환하는 최적의 방법
C#을 사용하다 보면 DataTable을 특정 객체 리스트(List<T>)로 변환해야 하는 경우가 많습니다. 데이터베이스에서 조회한 결과를 C# 객체로 매핑하면 관리하기가 훨씬 쉬워지죠. 이번 글에서는 C#에서 DataTable을 List로 변환하는 효율적인 방법을 소개합니다.
1. 기본적인 DataTable 변환 방법
일반적으로 DataTable을 특정 객체 리스트로 변환하려면 foreach 문을 사용해서 개별적으로 데이터를 매핑해야 합니다. 예를 들어, Demand라는 클래스가 있고, DataTable을 List<Demand>로 변환한다고 가정해 보겠습니다.
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
public class Demand
{
public int Id { get; set; }
public string Name { get; set; }
public double Value { get; set; }
}
List<Demand> demandList = demands.AsEnumerable().Select(row => new Demand
{
Id = row.Field<int>("Id"),
Name = row.Field<string>("Name"),
Value = row.Field<double>("Value")
}).ToList();
이 방식은 컬럼 이름이 객체의 속성과 일치할 때만 사용할 수 있으며, 컬럼이 누락되었을 경우 예외가 발생할 수 있습니다.
2. 컬럼 존재 여부를 체크하는 안전한 변환 방법
데이터 스키마가 변경될 가능성이 있는 경우, 컬럼 존재 여부를 체크하면서 변환하는 것이 좋습니다.
List<Demand> demandList = demands.AsEnumerable().Select(row => new Demand
{
Id = row.Table.Columns.Contains("Id") ? row.Field<int?>("Id") ?? 0 : 0,
Name = row.Table.Columns.Contains("Name") ? row.Field<string>("Name") ?? "Unknown" : "Unknown",
Value = row.Table.Columns.Contains("Value") ? row.Field<double?>("Value") ?? 0.0 : 0.0
}).ToList();
위 코드에서는 컬럼이 존재하는지 체크한 후 값을 가져오고, null인 경우 기본값을 할당합니다.
3. DataTable을 객체 리스트로 변환하는 재사용 가능한 확장 메서드
DataTable과 객체의 속성이 동일한 경우, 매번 변환 코드를 작성하는 대신 제네릭 확장 메서드를 만들면 코드 재사용성이 높아집니다.
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
public static class DataTableExtensions
{
public static List<T> ToList<T>(this DataTable table) where T : new()
{
List<T> list = new List<T>();
PropertyInfo[] properties = typeof(T).GetProperties();
foreach (DataRow row in table.Rows)
{
T obj = new T();
foreach (PropertyInfo prop in properties)
{
if (table.Columns.Contains(prop.Name) && row[prop.Name] != DBNull.Value)
{
prop.SetValue(obj, Convert.ChangeType(row[prop.Name], prop.PropertyType));
}
}
list.Add(obj);
}
return list;
}
}
이제 DataTable을 간단하게 변환할 수 있습니다.
List<Demand> demandList = demands.ToList<Demand>();
위 확장 메서드는 객체의 속성과 동일한 이름의 컬럼이 존재하는 경우 자동으로 데이터를 매핑합니다.
따라서 DataTable 스키마와 객체의 속성이 동일하다면 매우 편리하게 사용할 수 있습니다.
결론
- 기본적으로 LINQ를 이용해 DataTable을 객체 리스트로 변환할 수 있습니다.
- 컬럼이 없는 경우 예외가 발생할 수 있으므로 컬럼 존재 여부를 체크하는 것이 안전합니다.
- DataTableExtensions를 이용하면 어떤 객체에도 적용할 수 있는 재사용 가능한 변환 코드를 만들 수 있습니다.
반응형
'IT' 카테고리의 다른 글
MLCC란 무엇인가? (0) | 2025.03.20 |
---|---|
무한 루프(Infinite Loop)란? (0) | 2025.03.19 |
포스트모템(Postmortem)이란 무엇인가? (0) | 2025.03.10 |
SQL의 핵심 개념인 DML과 DDL의 차이점 (0) | 2025.03.05 |
PowerShell로 파일 복사 및 덮어쓰기 방법 | 간단한 명령어 정리 (0) | 2025.03.04 |