Как мне преобразовать данные в объект POCO в Asp.Net MVC? - PullRequest
6 голосов
/ 30 августа 2009

Как мне преобразовать данные в объект POCO в Asp.Net MVC?

Ответы [ 4 ]

10 голосов
/ 30 августа 2009

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

  public class POCO
  {
       public int ID { get; set; }
       public string Name { get; set; }
       public DateTime? Modified { get; set; }
       ...

       public POCO() { }

       public POCO( DataRow row )
       {
            this.ID = (int)row["id"];
            this.Name = (string)row["name"];
            if (!(row["modified"] is DBNull))
            {
                 this.Modified = (DateTime)row["modified"];
            }
            ...
       }
  }
5 голосов
/ 30 августа 2009

Таблица данных обычно содержит много строк - хотите ли вы преобразовать каждую строку в экземпляр объекта?

В этом случае вы можете, например, добавить конструктор к вашему объекту POCO, который примет DataRow в качестве параметра, а затем извлечет биты и куски из этого DataRow:

public YourPOCO(DataRow row)
{
   this.Field1 = row["Field1"].ToString();
   ...
   this.FieldN = Convert.ToInt32(row["FieldN"]);
}

и т. Д., А затем вызовите этот конструктор для каждой строки в коллекции DataTable.Rows:

List<YourPOCO> list = new List<YourPOCO>();

foreach(DataRow row in YourDataTable.Rows)
{
   list.Add(new YourPOCO(row));
}

И затем вы можете создать представление ASP.NET MVC или частичное представление на основе этого типа «YourPOCO» и использовать шаблон «Список» для создания списка экземпляров «YourPOCO» в виде списка.

Марк

3 голосов
/ 24 августа 2011

Старый вопрос, в любом случае это может быть полезно для кого-то:

private static T CreatePocoObject<T>(DataRow dr) where T : class, new()
{
    try
    {
        T oClass = new T();
        Type tClass = typeof (T);
        MemberInfo[] methods = tClass.GetMethods();
        ArrayList aMethods = new ArrayList();
        object[] aoParam = new object[1];

        //Get simple SET methods
        foreach (MethodInfo method in methods)
        {
            if (method.DeclaringType == tClass && method.Name.StartsWith("set_"))
                aMethods.Add(method);
        }

        //Invoke each set method with mapped value
        for (int i = 0; i < aMethods.Count; i++)
        {
            try
            {
                MethodInfo mInvoke = (MethodInfo)aMethods[i];
                //Remove "set_" from method name
                string sColumn = mInvoke.Name.Remove(0, 4);
                //If row contains value for method...
                if (dr.Table.Columns.Contains(sColumn))
                {
                    //Get the parameter (always one for a set property)
                    ParameterInfo[] api = mInvoke.GetParameters();
                    ParameterInfo pi = api[0];

                    //Convert value to parameter type
                    aoParam[0] = Convert.ChangeType(dr[sColumn], pi.ParameterType);

                    //Invoke the method
                    mInvoke.Invoke(oClass, aoParam);
                }
            }
            catch
            {
                System.Diagnostics.Debug.Assert(false, "SetValuesToObject failed to set a value to an object");
            }
        }

        return oClass;
    }
    catch
    {
        System.Diagnostics.Debug.Assert(false, "SetValuesToObject failed to create an object");
    }

    return null;
}

Источник: http://blog.developers.ie/cgreen/archive/2007/09/14/using-reflection-to-copy-a-datarow-to-a-class.aspx

1 голос
/ 31 августа 2009

Я видел ваш другой вопрос об использовании таблицы данных в слое доступа к данным. Если в какой-то момент вы вернете POCO, хорошей идеей будет позволить вашему DAL вернуть POCO уже.

Вы бы использовали SqlDataReader для заполнения POCO. Это более легкий вес. Иногда проще использовать DataSet и DataTable для списков записей, но если вы все равно преобразуете строки в POCOS со строгой типизацией, я довольно уверен, что это правильный путь.

...