Theme NexT works best with JavaScript enabled

ShunNien's Blog

不積跬步,無以致千里;不積小流,無以成江海。

0%

LinQ IQueryable 轉換 DataTable

Introduction

最近有些案子需要使用到這需求,把以前一些方法紀錄一下。

Conetent

目的是轉換 DateTable 使用,所以做法有很多,甚至是一開始就使用 DataSet 去取得資料來源等,但是這邊單純討論轉換 DataTable 。想要轉換到 DataTable 最常見的就是反射(Reflection) ,甚至官方都有文件資料說明如何實作 CopyToDataTable
以下就簡單說明反射的部分

此部分是引用黑暗執行緒大大 的範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public DataTable LinqQueryToDataTable<T>(IEnumerable<T> query)
{
DataTable tbl = new DataTable();
PropertyInfo[] props = null;
foreach (T item in query)
{
if (props == null) //尚未初始化
{
Type t = item.GetType();
props = t.GetProperties();
foreach (PropertyInfo pi in props)
{
Type colType = pi.PropertyType;
//針對Nullable<>特別處理
if (colType.IsGenericType
&& colType.GetGenericTypeDefinition() == typeof(Nullable<>))
colType = colType.GetGenericArguments()[0];
//建立欄位
tbl.Columns.Add(pi.Name, colType);
}
}
DataRow row = tbl.NewRow();
foreach (PropertyInfo pi in props)
row[pi.Name] = pi.GetValue(item, null) ?? DBNull.Value;
tbl.Rows.Add(row);
}
return tbl;
}

或是使用 Json 的方式來轉換,不過這方式最好使用在資料量比較小的情境下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public DataTable LinqToDataTableByJson<T>(IEnumerable<T> query)
{
JArray jObjects = new JArray();
PropertyInfo[] props = null;
foreach (var item in query)
{
Type t = item.GetType();
props = t.GetProperties();
var jo = new JObject();
foreach (PropertyInfo pi in props)
jo.Add(pi.Name, (JToken)pi.GetValue(item, null).ToString());
jObjects.Add(jo);
}
return JsonConvert.DeserializeObject<DataTable>(jObjects.ToString());
}

Sample

Reference

歡迎關注我的其它發布渠道