将DataTable转换为列表

时间:2012-03-22 20:35:59

标签: c# .net ado.net

    public static IList<Task> GetAllTasks()
    {
        return _taskSet.Task.ToList<Task>();
        // return sampleData.ToList();
    }

我正在将dataTable转换为列表,我收到以下错误。我怎样才能将表转​​换为List。

Error   1   Instance argument: cannot convert from     orkTimeTable.Dataset.TaskSet.TaskDataTable' to 'System.Collections.Generic.IEnumerable<WorkTimeTable.Model.Task>'    c:\users\huzaifa.gain\documents\visual studio 2010\Projects\WorkTimeTable\WorkTimeTable\Model\TaskDataService.cs    24  20  WorkTimeTable

Error   2   'WorkTimeTable.Dataset.TaskSet.TaskDataTable' does not contain a definition for 'ToList' and the best extension method overload 'System.Linq.Enumerable.ToList<TSource>(System.Collections.Generic.IEnumerable<TSource>)' has some invalid arguments    c:\users\huzaifa.gain\documents\visual studio 2010\Projects\WorkTimeTable\WorkTimeTable\Model\TaskDataService.cs    24  20  WorkTimeTable

5 个答案:

答案 0 :(得分:1)

始终:

List<DataRow> list = dt.AsEnumerable().ToList();

或者您可以为特定情况使用动态或静态类型

答案 1 :(得分:1)

尝试:

public static IList<Task> GetAllTasks()
{
    return _taskSet.Task.AsEnumerable().ToList();
}

答案 2 :(得分:1)

这将采用T类中数据表和填充字段的类似字段:

public List<T> ToList<T>(this DataTable dt)
{
    List<T> res = new List<T>();
    try {
        if (dt != null && dt.Rows.Count > 0) {
            object prps = typeof(T).GetProperties;
            object prpnames = prps.Select((System.Object f) => f.Name).ToList;
            for (i = 0; i <= dt.Rows.Count - 1; i++) {
                T Tinst = Activator.CreateInstance(typeof(T));
                for (j = 0; j <= dt.Columns.Count - 1; j++) {
                    int prpInd = prpnames.IndexOf(dt.Columns(j).ColumnName);
                    if (prpInd >= 0) {
                        prps(prpInd).SetValue(Tinst, dt(i)(j), null);
                    }
                }
                res.Add(Tinst);
            }
        }
    } catch (Exception ex) {
        PromptMsg(ex);
    }
    return res;
}

用法:如果我们有一个包含FirstName,LastName,othercolumns ...和

的数据表
public class classSample{

    private string _FirstName;
    public string FirstName{
        get {
            return _FirstName;
        }
        set {
            _FirstName = value;
        }
    }

    private string _LastName;
    public string LastName{
        get {
            return _LastName;
        }
        set {
            _LastName = value;
        }
    }

}

因此,这将返回classSample列表:

someDT.ToList<classSample>();

答案 3 :(得分:1)

public static IList<Task> GetAllTasks()
    {
        List<Task> taskList = new List<Task>();
        foreach (TaskSet.TaskRow r in _taskSet.Task.AsEnumerable())
            taskList.Add(new WorkTimeTable.Model.Task()
                             {
                                 Name = r.Name, Description = r.Description, ToDateTime = r.ToDate, FromDateTime = r.FromDate, TotalTime = r.TimeSpan
                             });
        return taskList;
    }

答案 4 :(得分:0)

使用以下类将数据表转换为列表。

public static class Helper
{



    public static List<T> DataTableToList<T>(this DataTable dataTable) where T : new()
    {
        var dataList = new List<T>();

        //Define what attributes to be read from the class
        const System.Reflection.BindingFlags flags = System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance;

        //Read Attribute Names and Types
        var objFieldNames = typeof(T).GetProperties(flags).Cast<System.Reflection.PropertyInfo>().
            Select(item => new
            {
                Name = item.Name,
                Type = Nullable.GetUnderlyingType(item.PropertyType) ?? item.PropertyType
            }).ToList();

        //Read Datatable column names and types
        var dtlFieldNames = dataTable.Columns.Cast<DataColumn>().
            Select(item => new
            {
                Name = item.ColumnName,
                Type = item.DataType
            }).ToList();

        foreach (DataRow dataRow in dataTable.AsEnumerable().ToList())
        {
            var classObj = new T();

            foreach (var dtField in dtlFieldNames)
            {
                System.Reflection.PropertyInfo propertyInfos = classObj.GetType().GetProperty(dtField.Name);

                var field = objFieldNames.Find(x => x.Name == dtField.Name);

                if (field != null)
                {

                    if (propertyInfos.PropertyType == typeof(DateTime))
                    {
                        propertyInfos.SetValue
                        (classObj, convertToDateTime(dataRow[dtField.Name]), null);
                    }
                    else if (propertyInfos.PropertyType == typeof(Nullable<DateTime>))
                    {
                        propertyInfos.SetValue
                        (classObj, convertToDateTime(dataRow[dtField.Name]), null);
                    }
                    else if (propertyInfos.PropertyType == typeof(int))
                    {
                        propertyInfos.SetValue
                        (classObj, ConvertToInt(dataRow[dtField.Name]), null);
                    }
                    else if (propertyInfos.PropertyType == typeof(long))
                    {
                        propertyInfos.SetValue
                        (classObj, ConvertToLong(dataRow[dtField.Name]), null);
                    }
                    else if (propertyInfos.PropertyType == typeof(decimal))
                    {
                        propertyInfos.SetValue
                        (classObj, ConvertToDecimal(dataRow[dtField.Name]), null);
                    }
                    else if (propertyInfos.PropertyType == typeof(String))
                    {
                        if (dataRow[dtField.Name].GetType() == typeof(DateTime))
                        {
                            propertyInfos.SetValue
                            (classObj, ConvertToDateString(dataRow[dtField.Name]), null);
                        }
                        else
                        {
                            propertyInfos.SetValue
                            (classObj, ConvertToString(dataRow[dtField.Name]), null);
                        }
                    }
                    else
                    {

                        propertyInfos.SetValue
                            (classObj, Convert.ChangeType(dataRow[dtField.Name], propertyInfos.PropertyType), null);

                    }
                }
            }
            dataList.Add(classObj);
        }
        return dataList;
    }

    private static string ConvertToDateString(object date)
    {
        if (date == null)
            return string.Empty;

        return date == null ? string.Empty : Convert.ToDateTime(date).ConvertDate();
    }

    private static string ConvertToString(object value)
    {
        return Convert.ToString(ReturnEmptyIfNull(value));
    }

    private static int ConvertToInt(object value)
    {
        return Convert.ToInt32(ReturnZeroIfNull(value));
    }

    private static long ConvertToLong(object value)
    {
        return Convert.ToInt64(ReturnZeroIfNull(value));
    }

    private static decimal ConvertToDecimal(object value)
    {
        return Convert.ToDecimal(ReturnZeroIfNull(value));
    }

    private static DateTime convertToDateTime(object date)
    {
        return Convert.ToDateTime(ReturnDateTimeMinIfNull(date));
    }

    public static string ConvertDate(this DateTime datetTime, bool excludeHoursAndMinutes = false)
    {
        if (datetTime != DateTime.MinValue)
        {
            if (excludeHoursAndMinutes)
                return datetTime.ToString("yyyy-MM-dd");
            return datetTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
        }
        return null;
    }
    public static object ReturnEmptyIfNull(this object value)
    {
        if (value == DBNull.Value)
            return string.Empty;
        if (value == null)
            return string.Empty;
        return value;
    }
    public static object ReturnZeroIfNull(this object value)
    {
        if (value == DBNull.Value)
            return 0;
        if (value == null)
            return 0;
        return value;
    }
    public static object ReturnDateTimeMinIfNull(this object value)
    {
        if (value == DBNull.Value)
            return DateTime.MinValue;
        if (value == null)
            return DateTime.MinValue;
        return value;
    }
}

您可以将数据表转换为列表

var mytbl=dt.DataTableToList();