C# System.Data.DuplicateNameException:名为“Item”的列已属于此DataTable

C# System.Data.DuplicateNameException:名为“Item”的列已属于此DataTable,c#,datatable,C#,Datatable,我有一个扩展方法将IEnumerable转换为数据表,它抛出了这个异常。System.Data.DuplicateNameException:名为“Item”的列已属于此DataTable。令人困惑的是,该表中没有名为“Item”的列,或者至少不应该有,因为创建它的SqlTable没有“Item”列 public static DataTable ToDataTable<T>(this IEnumerable<T> items) { var dataTable =

我有一个扩展方法将IEnumerable转换为数据表,它抛出了这个异常。System.Data.DuplicateNameException:名为“Item”的列已属于此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;
}
我尝试在扩展方法中检查列是否已经被添加,但是得到了 System.Reflection.TargetParameterCountException:参数计数不匹配


如何使用DataTable作为可枚举项来更新每行的一列,并使其再次成为DataTable?

作为补充,为什么要使用反射从数据库查询创建DataTable,而不是使用DataAdapter.Filltable?此外,已经有一个用于此目的的CopyToDataTable可用于任何类型:
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;
}
foreach (var prop in props)
{
    if (dataTable.Columns.Contains(prop.Name))
    dataTable.Columns.Add(prop.Name, prop.PropertyType);
}