Как преобразовать Datatable в список в .NET? - PullRequest
2 голосов
/ 20 июля 2011

Я работаю в системе, в которой вызов БД возвращает список строго типизированных.Мне нужно перехватить список, внести изменения в данные и затем отправить их дальше.Это чувствительный ко времени, большой объем и сквозное приложение;поэтому мне нужен очень эффективный способ сделать это преобразование.Из-за характера манипуляций с данными я конвертирую список в датированный.Преобразование в DT не является проблемой, как манипуляция;преобразование обратно в строго типизированный список является проблемой.Я должен преобразовать его обратно, так как код вниз по потоку ожидает список.Я посмотрел, и на большинстве страниц рассказывается о преобразовании Списка в DataTable, пара выполняет преобразование Списка данных в Общий список, а не в Типизированный список.

Я пробовал AsEnumerable() и ToList(), проблема заключается в назначениивернуться к набранному списку.

Логика:

List<< TypedlistDef>> Lst = new List<< TypedlistDef>>();
DataTable dt = new DataTable();

dt = Helper.ListToDataTable(Lst)

манипулировать dt

Lst = List<< TypedlistDef>>dt.????????        <---- Problem

Я работаю в VS2010 Framework 3.5.

Заранее благодарю за любую помощь.

1 Ответ

4 голосов
/ 20 июля 2011

Вы можете использовать Linq to DataSets , если хотите

  List<SomeType> Lst  = (from r in dataTable.AsEnumerable()
                        select new YourType()
            {
                SomeProperty = r.Field<string>("SomeField"),
                SomeOtherProperty = r.Field<string>("SomeOtherField")
            }).ToList();

Вот полный пример

class Program
    {
        static void Main(string[] args)
        {

            DataSet ds = new DataSet();
            DataTable dt = new DataTable();
            dt.TableName = "source";
            dt.Columns.Add(new DataColumn ("First",typeof (string)));
            dt.Columns.Add(new DataColumn ("Last",typeof (string)));

            ds.Tables.Add(dt);
            dt.Rows.Add("Charles", "Babbage ");
            dt.Rows.Add("Ada", "Lovelace");

            List<YourType>  YourTypeList = (from r in ds.Tables[0].AsEnumerable()
                        select new YourType()
            {
                First = r.Field<string>("First"),
                Last = r.Field<string>("Last")
            }).ToList();

            foreach(YourType yt in YourTypeList)
            {
                Console.WriteLine("{0}, {1}", yt.First, yt.Last);
            }

        }

    }

    class YourType
    { 
        public string First {get;set;}
        public string Last { get; set; }



    }

с использованием foreach над DataTable.Rows и добавлением ихк списку также будет работать

         List<YourType> YourTypeList = new List<YourType>();
        foreach(DataRow r in dt.Rows )
        {
            YourTypeList.Add(new YourType() { 
                First = r.Field<string>("First"), 
                Last = r.Field<string>("Last") });

        }
...