在dataTable中填充数据库中的所有数据,并构建一个列表

本文关键字:构建 列表 一个 数据 数据库 填充 dataTable | 更新日期: 2023-09-27 18:15:43

我有两个这样的对象:

public class Place : ICloneable, IEquatable<Place>
{
    public string Name{ get; set; }
    public float longitude{ get; set; }
    public float latitude{ get; set; }
    public Horizon thehorizon  { get; set; }
    ...
}
public class Horizon
{
    public List<PointF> points{ get; set; }
}

在我的数据库中,我有2个表-"地方"answers"地平线",在地平线上有一个外键来知道这些点属于哪个地方。

所以位置的结构是:

  1. Name -nvarchar -主键
  2. 经度-实际
  3. 纬度-实际

,视界的结构为

  1. parent_key - nvarchar
  2. pointX - real
  3. point - real

我写了下面的代码来选择所有的数据并建立一个位置列表。它起作用了,但是很慢。如果你有任何建议如何使它更快(或任何评论),请告诉我。

DataTable TablePlaces;
DataTable TableHorizons;
public void init()
{
    TablePlaces = new DataTable();
    TablePlaces.Columns.Add("Name");
    TablePlaces.Columns.Add("longitude");
    TablePlaces.Columns.Add("latitude");
    TableHorizons = new DataTable();
    TableHorizons.Columns.Add("parent_key");
    TableHorizons.Columns.Add("pointX");
    TableHorizons.Columns.Add("pointY");
    System.Data.DataSet DS = new DataSet();
    DS.Tables.Add(TablePlaces);
    DS.Tables.Add(TableHorizons);
    DS.Relations.Add(TablePlaces.Columns["Name"],
        TableHorizons.Columns["parent_key"]);
}
public List<Place> BuilsListPlace()
{
    TableHorizons.Clear();
    TablePlaces.Clear();
    using (DbCommand Command = newConnectionNewCommand())
    {
        Command.CommandText = "SELECT * FROM places ORDER BY Name"
        fill(TablePlaces, Command);
        Command.CommandText = "SELECT * FROM horizons ORDER BY parent_key,pointX";
        fill(TableHorizons, Command);
        Command.Connection.Dispose();
    }
    return (from DataRow dr in TablePlaces.Rows
            select newPlace(dr)).ToList();
}
void fill(TableDB t ,DbCommand Command)
{
    using (var da = newDataAdapter())
    {
        da.SelectCommand = Command;
        da.MissingSchemaAction = MissingSchemaAction.Ignore;
        da.Fill(t);
    }
} 
Place newPlace(DataRow dr)
{
    Place result = new Place();
    result.longitude=(float)dr["longitude"];
    result.latitude=(float)dr["latitude"];
    result.Name=(string)dr["Name"];
    result.theHorizon=newHorizon(dr.GetChildRows(dr.Table.ChildRelations[0]));
    return result;
}
Horizon newHorizon(DataRow[] Rows)
{
    Horizon result = new Horizon();
    result.points = new List<PointF>();
    foreach(DataRow dr in Rows)
        result.points.Add(new PointF((float)dr["pointX"],(float)dr["pointY"]);
    return result;
}

在dataTable中填充数据库中的所有数据,并构建一个列表

这个扩展我发现转换datatablelist of objects使用反射&泛型,但要记住属性名必须与datatable

中的属性名完全相同。

希望有帮助

public static List<T> DataTableToList<T>(this DataTable table) where T : class, new()
{
    try
    {
        List<T> list = new List<T>();
        foreach (var row in table.AsEnumerable())
        {
            T obj = new T();
            foreach (var prop in obj.GetType().GetProperties())
            {
                try
                {
                    PropertyInfo propertyInfo = obj.GetType().GetProperty(prop.Name);
                    propertyInfo.SetValue(obj, Convert.ChangeType(row[prop.Name], propertyInfo.PropertyType), null);
                }
                catch
                {
                    continue;
                }
            }
            list.Add(obj);
        }
        return list;
    }
    catch
    {
        return null;
    }
}

我会尽量只选择你真正需要的东西。虽然你说你有大约1800个地方(这应该不是问题)…试试下面的

public IList GetPlaces()
{
  using (var conn = new SqlConnection("blahblahblah"))
  {
    conn.Open();
    var cmd = conn.CreateCommand();
    cmd.CommandText = "SELECT p.Name, h.pointX, h.pointY FROM places p LEFT OUTER JOIN horizons h ON h.parent_key = p.Name";
    DataTable tbl = new DataTable();
    using (var rdr = cmd.ExecuteReader())
      tbl.Load(rdr);
    return tbl.Rows
      .Cast<DataRow>()
      .Select(r => new
        {
          Name = r.Field<string>("Name"),
          HorizonX = r.Field<float>("pointX"),
          HorizonY = r.Field<float>("pointY")
        }).ToList();
  }
}

下面的"选择"部分返回的是一个匿名类型,而不是您正在寻找的类型。但是,从这里开始,并使用Select/SelectMany a.s.o将其转换为您的类应该不难。

请注意,如何将数据返回到List并不重要,重要的是如何从数据库读取数据