nik varma Ответов: 2

Как получить данные из datatable в список


public class Location_Master
    {
                
        public List<Locations> Locations { get; set; }
        public List<Response> Response { get; set; }
    }

    public class Locations
    {
        public int id { get; set; }
        public string lat { get; set; }
        public string longs { get; set; }
        public string country { get; set; }
        public string country_code { get; set; }
        public string name { get; set; }
        public int country_id { get; set; }
    }




public void Locations(Location_Master lm)
        {
            DataTable _dt = new DataTable();
            _balL = new Safety_DAL.BALLocation();
                _dt = _balL.getAllLocations();
                lm.Locations = (from DataRow dr in _dt.Rows
                                select new Locations()
                                {
                                    id = Convert.ToInt32(_dt.Rows[0]["id"].ToString()),
                                    country = _dt.Rows[0]["country_name"].ToString(),
                                    country_code = _dt.Rows[0]["Country_ISD_Code"].ToString(),
                                    lat = _dt.Rows[0]["Location_Lat"].ToString(),
                                    longs = _dt.Rows[0]["Location_Long"].ToString(),
                                    name = _dt.Rows[0]["Name"].ToString(),
                                    country_id = Convert.ToInt32(_dt.Rows[0]["country_id"].ToString())
                                }).ToList();
                
                lm.Response = new List<Response>(){
                    new Response(){
                        response_code = 1,
                        success = true
                    }
                };
            }



выход

"Пункты назначения": [
{
"id": 1,
"широта": "19.0760° с. ш.",
"лонги": "72.8777° E",
"страна": "Индия",
"код страны": "91",
"имя": "Мумбаи",
"country_id": 92
},
{
"id": 1,
"широта": "19.0760° с. ш.",
"лонги": "72.8777° E",
"страна": "Индия",
"код страны": "91",
"имя": "Мумбаи",
"country_id": 92
}
]

Что я уже пробовал:

я получаю ту же запись в списке, что и выше, тот же идентификатор и другие данные тоже, где, как это должно быть id 1 и id 2



public class Location_Master
    {
        //public Int32 id { get; set; }
        //public string name { get; set; }

        //public virtual ICollection<Incident_Data> Incident_Data { get; set; }
        //public virtual User_Master User_Master { get; set; }
        public List<Locations> Locations { get; set; }
        public List<Response> Response { get; set; }
    }

    public class Locations
    {
        public int id { get; set; }
        public string lat { get; set; }
        public string longs { get; set; }
        public string country { get; set; }
        public string country_code { get; set; }
        public string name { get; set; }
        public int country_id { get; set; }
    }




public void Locations(Location_Master lm)
        {
            DataTable _dt = new DataTable();
            _balL = new Safety_DAL.BALLocation();
                _dt = _balL.getAllLocations();
                lm.Locations = (from DataRow dr in _dt.Rows
                                select new Locations()
                                {
                                    id = Convert.ToInt32(_dt.Rows[0]["id"].ToString()),
                                    country = _dt.Rows[0]["country_name"].ToString(),
                                    country_code = _dt.Rows[0]["Country_ISD_Code"].ToString(),
                                    lat = _dt.Rows[0]["Location_Lat"].ToString(),
                                    longs = _dt.Rows[0]["Location_Long"].ToString(),
                                    name = _dt.Rows[0]["Name"].ToString(),
                                    country_id = Convert.ToInt32(_dt.Rows[0]["country_id"].ToString())
                                }).ToList();
                
                lm.Response = new List<Response>(){
                    new Response(){
                        response_code = 1,
                        success = true
                    }
                };
            }

2 Ответов

Рейтинг:
20

Andy Lanng

Вы собираетесь ударить себя, когда увидите это :P

менять

id = Convert.ToInt32(_dt.Rows[0]["id"].ToString())

к
id = Convert.ToInt32(dr["id"].ToString())


сделайте это для каждого элемента запроса linq


nik varma

ха-ха, да
только что нашел ссылку, но большое вам спасибо и дал вам полный рейтинг :)
http://www.aspdotnet-suresh.com/2014/11/csharp-convert-datatable-to-generic-list-example-using-linq.html

Рейтинг:
1

#realJSOP

List<Locations> locations = new List<Locations>();

DataTableReader reader = dt.CreateDataReader();
if (reader != null && reader.HasRows)
{
    while (reader.Read())
    {
        locations.Add(new Locations()
        {
            // call the appropriate reader.GetXXXXX mthod that is appropriate for the property type
            id = reader.GetInt32("id"),
            ...
        });
    }
}


Я написал кучу методов расширения для DataTableReader, которые позволяют мне назначать значения по умолчанию в случае, если что-то вернулось шатким (да, моя среда данных может давать шаткие результаты даже из базы данных). Я также обращаюсь к читателю по порядковому значению столбца, а не по имени, чтобы убедиться, что нужный столбец действительно существует в таблице. Пример:

public static Int32 GetInt32OrDefault(this DataTableReader reader, int ordinal, Int32 defaultValue)
{
    Int32 value = defaultValue;
    if (!reader.IsDBNull(ordinal))
    {
        value = reader.GetInt32(ordinal);
    }
    return value;
}