我有一个扩展方法将IEnumerable转换为数据表,并抛出此异常。 System.Data.DuplicateNameException: A column named 'Item' already belongs to this DataTable.
令人困惑的是,没有列名为' Item'在这个表中,或者至少不应该因为它创建的SqlTable没有' Item'列。
public static DataTable ToDataTable<T>(this IEnumerable<T> items)
{
var dataTable = new DataTable(typeof(T).Name);
var props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var prop in props)
{
dataTable.Columns.Add(prop.Name, prop.PropertyType);
}
foreach (var item in items)
{
var values = new object[props.Length];
for (var i = 0; i < props.Length; i++)
{
values[i] = props[i].GetValue(item, null);
}
dataTable.Rows.Add(values);
}
return dataTable;
}
这种扩展方法一直在工作,除非直到现在我将它与一个接受sql表并使其成为数据表的方法一起使用,然后将数据表转换为IEnumerable以更新一列,然后使用扩展方法Ienumerable将它变回数据表。
var strSqlQuery = "Select * FROM " + strTableName;
var dataTable = Database.CreateDataTableFromDatabaseTable(strSqlQuery);
var ocRows = dataTable.AsEnumerable(); // turn the data table into an enumerable we can sqlbulkcopy dump later
foreach (var dataRow in ocRows)
{
if (dataRow[4].ToString().Contains("COMPLETED")) continue;
// Generate and Save Needed Hashes for this Node
// This is the algorithm to generate the hash
var md5Hash = MD5.Create();
var profileId = Database.GetProfileIdByEndPage(dataRow[3].ToString(), false);
var endPageId = Database.GetEndPageId(navigationProfileId);
var strValuesForObjectHash = string.IsNullOrEmpty(dataRow[6].ToString()) // if the "id" is null or empty use xpath
? endPageId + "," + dataRow[7] // use the xpath for the object hash, not the "id"
: endPageId + "," + dataRow[6]; // if the id has a value use the id for the object hash
var currentObjectHash = strValuesForObjectHash.GetMd5Hash(md5Hash);
dataRow[1] = currentObjectHash;
}
我尝试使用扩展方法来检查列是否已经添加但是后来了
System.Reflection.TargetParameterCountException: Parameter count mismatch.
foreach (var prop in props)
{
if (dataTable.Columns.Contains(prop.Name))
dataTable.Columns.Add(prop.Name, prop.PropertyType);
}
如何使用DataTable作为可枚举来更新每一行的一列并再次将其变为DataTable?