DataTable을 클래스 Object로 변환하는 방법은 무엇입니까?
나는 이미 반환되는 애플리케이션을 개발했습니다.DataTable
온통.
이제 클라이언트가 변환(서비스 스택을 사용하여 일부 부분 사용)을 원하므로 반환해야 합니다.DTO (objects)
내 신청으로
기존 저장 프로시저를 변경하거나 LINQ를 최대한 사용하고 싶지 않습니다(LINQ에 대해 잘 알지 못합니다).
작은 기능을 위해, 저는 문제없이 Linkq를 사용할 수 있습니다.
제 질문은 다음과 같습니다. 어떻게 변경할 수 있습니까?DataTable
그런 종류의 물건에?
샘플 코드는 다음과 같습니다.
string s = DateTime.Now.ToString();
DataTable dt = new DataTable();
dt.Columns.Add("id");
dt.Columns.Add("name");
for (int i = 0; i < 5000000; i++)
{
DataRow dr = dt.NewRow();
dr["id"] = i.ToString();
dr["name"] = "name" + i.ToString();
dt.Rows.Add(dr);
dt.AcceptChanges();
}
List<Class1> clslist = new List<Class1>();
for (int i = 0; i < dt.Rows.Count; i++)
{
Class1 cls = new Class1();
cls.id = dt.Rows[i]["id"].ToString();
cls.name = dt.Rows[i]["name"].ToString();
clslist.Add(cls);
}
Response.Write(s);
Response.Write("<br>");
Response.Write(DateTime.Now.ToString());
알아요, 위 방법은 시간이 많이 걸리고, 다른 방법을 찾고 있어요.
테이블의 행을 직접 변환하는 다른 방법이 있습니까(LINQ to DataTable)?List<Class1>
?
서비스 스택의 개체를 반환하고 계속 진행할 수 있습니다.
데이터 테이블 초기화:
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(String));
dt.Columns.Add("name", typeof(String));
for (int i = 0; i < 5; i++)
{
string index = i.ToString();
dt.Rows.Add(new object[] { index, "name" + index });
}
쿼리 자체:
IList<Class1> items = dt.AsEnumerable().Select(row =>
new Class1
{
id = row.Field<string>("id"),
name = row.Field<string>("name")
}).ToList();
Amit, 저는 이것을 더 적은 코딩과 더 효율적인 방법으로 달성하기 위해 한 가지 방법을 사용했습니다.
하지만 그것은 Linq를 사용합니다.
아마 다른 SO들에게 도움이 될 수도 있기 때문에 여기에 올렸습니다.
아래의 DAL 코드는 데이터 테이블 객체를 당신의 뷰 모델 목록으로 변환하며 이해하기 쉽습니다.
public static class DAL
{
public static string connectionString = ConfigurationManager.ConnectionStrings["YourWebConfigConnection"].ConnectionString;
// function that creates a list of an object from the given data table
public static List<T> CreateListFromTable<T>(DataTable tbl) where T : new()
{
// define return list
List<T> lst = new List<T>();
// go through each row
foreach (DataRow r in tbl.Rows)
{
// add to the list
lst.Add(CreateItemFromRow<T>(r));
}
// return the list
return lst;
}
// function that creates an object from the given data row
public static T CreateItemFromRow<T>(DataRow row) where T : new()
{
// create a new object
T item = new T();
// set the item
SetItemFromRow(item, row);
// return
return item;
}
public static void SetItemFromRow<T>(T item, DataRow row) where T : new()
{
// go through each column
foreach (DataColumn c in row.Table.Columns)
{
// find the property for the column
PropertyInfo p = item.GetType().GetProperty(c.ColumnName);
// if exists, set the value
if (p != null && row[c] != DBNull.Value)
{
p.SetValue(item, row[c], null);
}
}
}
//call stored procedure to get data.
public static DataSet GetRecordWithExtendedTimeOut(string SPName, params SqlParameter[] SqlPrms)
{
DataSet ds = new DataSet();
SqlCommand cmd = new SqlCommand();
SqlDataAdapter da = new SqlDataAdapter();
SqlConnection con = new SqlConnection(connectionString);
try
{
cmd = new SqlCommand(SPName, con);
cmd.Parameters.AddRange(SqlPrms);
cmd.CommandTimeout = 240;
cmd.CommandType = CommandType.StoredProcedure;
da.SelectCommand = cmd;
da.Fill(ds);
}
catch (Exception ex)
{
return ex;
}
return ds;
}
}
자, 통과 방법과 통화 방법은 아래와 같습니다.
DataSet ds = DAL.GetRecordWithExtendedTimeOut("ProcedureName");
List<YourViewModel> model = new List<YourViewModel>();
if (ds != null)
{
//Pass datatable from dataset to our DAL Method.
model = DAL.CreateListFromTable<YourViewModel>(ds.Tables[0]);
}
지금까지 많은 애플리케이션에서 데이터를 얻기 위한 최상의 구조라고 생각했습니다.
이것을 보고 깨달았죠. 이것은 한 종류의 물체에서 다른 종류의 물체로 옮겨가는 것입니다. 기본적으로 우리는 적절한 반사를 하려고 노력하고 있습니다.
다른 분야 간의 관계를 구성하는 적절한 방법이 있지만 클래스 정의를 제공하면 뉴턴소프트에서 쉽게 수행할 수 있습니다.슨
프로세스:DataSet/DataTable(Serialize) ==> Json(Deserialize) ==> Target Object List 이 예에서는 OP로서 다음을 수행합니다.
string serializeddt = JsonConvert.SerializeObject(dt, Formatting.Indented);
이제 데이터 테이블이 일반 문자열로 직렬화됩니다.다음을 수행합니다.
List<Class1> clslist = JsonConvert.DeserializeObject<List<Class1>>(serialized, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
이제 모든 DataTable 행이 포함된 List를 개별 객체로 만들어야 합니다.
2023년 기준으로 훨씬 단순하고 버전이 낮은 코드
public class ClassName
{
public int Id { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
}
클래스 객체 목록의 경우
DataTable dt = new DataTable();
var _objectList = JArray.FromObject(dt).ToObject<List<Venues>>();
클래스 개체의 경우
DataTable dt = new DataTable();
var _object = JArray.FromObject(dt)[].ToObject<Venues>();
Vb입니다.넷 버전:
Public Class Test
Public Property id As Integer
Public Property name As String
Public Property address As String
Public Property createdDate As Date
클래스 종료
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim x As Date = Now
Debug.WriteLine("Begin: " & DateDiff(DateInterval.Second, x, Now) & "-" & Now)
Dim dt As New DataTable
dt.Columns.Add("id")
dt.Columns.Add("name")
dt.Columns.Add("address")
dt.Columns.Add("createdDate")
For i As Integer = 0 To 100000
dt.Rows.Add(i, "name - " & i, "address - " & i, DateAdd(DateInterval.Second, i, Now))
Next
Debug.WriteLine("Datatable created: " & DateDiff(DateInterval.Second, x, Now) & "-" & Now)
Dim items As IList(Of Test) = dt.AsEnumerable().[Select](Function(row) New _
Test With {
.id = row.Field(Of String)("id"),
.name = row.Field(Of String)("name"),
.address = row.Field(Of String)("address"),
.createdDate = row.Field(Of String)("createdDate")
}).ToList()
Debug.WriteLine("List created: " & DateDiff(DateInterval.Second, x, Now) & "-" & Now)
Debug.WriteLine("Complated")
End Sub
json convert로 하면 비용이 많이 드나요?하지만 적어도 2라인 솔루션과 일반 솔루션이 있습니다.데이터 테이블에 개체 클래스보다 많은 필드가 포함되어 있든 적은 필드가 포함되어 있든 상관 없습니다.
Dim sSql = $"SELECT '{jobID}' AS ConfigNo, 'MainSettings' AS ParamName, VarNm AS ParamFieldName, 1 AS ParamSetId, Val1 AS ParamValue FROM StrSVar WHERE NmSp = '{sAppName} Params {jobID}'"
Dim dtParameters As DataTable = DBLib.GetDatabaseData(sSql)
Dim paramListObject As New List(Of ParameterListModel)()
If (Not dtParameters Is Nothing And dtParameters.Rows.Count > 0) Then
Dim json = Newtonsoft.Json.JsonConvert.SerializeObject(dtParameters).ToString()
paramListObject = Newtonsoft.Json.JsonConvert.DeserializeObject(Of List(Of ParameterListModel))(json)
End If
언급URL : https://stackoverflow.com/questions/8008389/how-to-convert-datatable-to-class-object
'programing' 카테고리의 다른 글
업데이트 쿼리에서 최대 절전 모드를 사용하도록 강제하는 방법은 무엇입니까? (0) | 2023.08.24 |
---|---|
엑셀 vba를 이용한 유튜브 자막 다운로드 (0) | 2023.08.24 |
스프링 부트json 본문의 일부로 멀티파트 파일 업로드 (0) | 2023.08.24 |
PowerShell 노트 속성이란? (0) | 2023.08.24 |
iOS 흰색에서 투명 그라데이션 계층은 회색입니다. (0) | 2023.08.24 |