如何動態地將LINQ查詢結果轉換爲DataTable?如何動態地將LINQ查詢結果轉換爲DataTable?
有些解決方案可以創建另一個類並指定列名,但我希望能夠靈活地更改LINQ結構(如列名,列數),並自動生成帶有列名的DataTable。
感謝
如何動態地將LINQ查詢結果轉換爲DataTable?如何動態地將LINQ查詢結果轉換爲DataTable?
有些解決方案可以創建另一個類並指定列名,但我希望能夠靈活地更改LINQ結構(如列名,列數),並自動生成帶有列名的DataTable。
感謝
我已經包含了一個擴展方法,我使用SqlBulkCopy來完成這個工作,但是我想問你爲什麼要這個轉換。數量有限的情況下(SqlBulkCopy是一個),其中一個對象列表不能做一切數據表可以。您可以將它們用作大多數控件的綁定源......只是好奇。
public static DataTable toDataTable<T>(this IEnumerable<T> value, List<string> exclusionList)
where T : class
{
var dataTable = new DataTable();
var type = typeof(T);
var properties = type.GetProperties().Where(x => !exclusionList.Contains(x.Name)).ToList();
foreach (var propertyInfo in properties)
{
var propertyType = propertyInfo.PropertyType;
if (!propertyType.IsScalar())
continue;
var nullableType = Nullable.GetUnderlyingType(propertyType);
propertyType = nullableType ?? propertyType;
var dataColumn = new DataColumn(propertyInfo.Name, propertyType);
if (nullableType != null)
dataColumn.AllowDBNull = true;
dataTable.Columns.Add(dataColumn);
}
foreach (var row in value)
{
var dataRow = dataTable.NewRow();
foreach (var property in properties)
{
var safeValue = property.GetValue(row, null) ?? DBNull.Value;
dataRow[property.Name] = safeValue;
}
dataTable.Rows.Add(dataRow);
}
return dataTable;
}
他們關鍵是使用LINQ查詢結果作爲其實現IList接口。 如果您收到的結果作爲一個參數上的方法作爲一個IList對象,你可以訪問它的行和列,這樣說:
var props = item.GetType().GetProperties();
參考這個例子中,它是一個小類請你只注意它抽象DataTable的創建,並且裏面有一個叫做「LINQToDataTable」的靜態方法,你應該使用它。
步驟1,創建一個名爲 「GridHelper」 類(使用System.Data DataTable的用於結構)
public class GridHelper
{
private DataTable baseDt;
public GridHelper(string tableName)
{
baseDt = new DataTable(tableName);
}
public DataTable getDataTable()
{
return baseDt;
}
public object[,] getObjToFill()
{
object[,] obj = new object[baseDt.Columns.Count, 2];
for (int i = 0; i < baseDt.Columns.Count; i++)
{
obj[i, 0] = baseDt.Columns[i].ColumnName;
}
return obj;
}
public void addColumn(string colName, Type valueType)
{
baseDt.Columns.Add(colName, valueType);
}
public void addRow(object[,] values)
{
DataRow newRow = baseDt.NewRow();
for (int i = 0; i < values.Length/2; i++)
{
bool colFound = false;
for (int j = 0; j < baseDt.Columns.Count; j++)
{
if (baseDt.Columns[j].ColumnName == values[i, 0].ToString())
{
colFound = true;
break;
}
}
if (colFound == false)
{
throw new Exception("The column " + values[i, 0].ToString() + " has not been added yet.");
}
newRow[values[i, 0].ToString()] = values[i, 1];
}
baseDt.Rows.Add(newRow);
}
public static DataTable LINQToDataTable<T>(T objToList) where T : System.Collections.IList
{
GridHelper ghResult = new GridHelper("Report");
foreach (Object item in objToList)
{
var props = item.GetType().GetProperties();
foreach (var prop in props)
{
ghResult.addColumn(prop.Name, typeof(string));
//prop.Name
//prop.GetValue(item)
}
break;
}
object[,] obj = ghResult.getObjToFill();
foreach (Object item in objToList)
{
var props = item.GetType().GetProperties();
int index = 0;
foreach (var prop in props)
{
//ReportValue(prop.Name, prop.GetValue(item, null));
//prop.Name
obj[index, 1] = prop.GetValue(item);
index++;
}
ghResult.addRow(obj);
}
return ghResult.getDataTable();
}
}
用法:
var listaReporte =
(from t in dbContext.TablaPruebas
select new
{
Name = t.name,
Score = t.score
}
) .ToList();
DataTable dt = Library.GridHelper.LINQToDataTable(listaReporte);
,那就是,用你的數據表如您所願,在GridView或DataGridView上
查看MoreLinq Nuget包。它有一個功能ToDataTable()
var LinqResults = from ......;
DataTable dt_Results = LinqResults.ToDataTable();
https://code.google.com/p/morelinq/
它具有其他非常有用的功能,以及: https://code.google.com/p/morelinq/wiki/OperatorsOverview
讓我們假設你有一個圖書館一類檢索使用LINQ從數據庫中的信息,您想要返回不同類型的項目,如Windows Form(DataGridView),Web Form(GridView)等可以顯示信息的結果,您不能返回Anonymous類型的列表。我試圖使用你的擴展,但我不知道IsScalar()是在哪裏聲明的。 – 2014-10-31 16:57:02
標量是在另一個庫中,你可以把它拉出來 – 2014-10-31 17:03:07