6

Asp.Net MVCでデータテーブルをPOCOオブジェクトに変換するにはどうすればよいですか?

4

4 に答える 4

10

各DataRowをクラスコンストラクターに渡し(またはゲッター/セッターを使用して)、各列を対応するプロパティに変換します。null許容列に注意して、適切に抽出してください。

  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"];
            }
            ...
       }
  }
于 2009-08-30T14:54:03.003 に答える
5

データテーブルには通常、多くの行が含まれています。各行をオブジェクトインスタンスに変換しますか?

その場合、たとえば、DataRowパラメータとしてを受け入れるコンストラクタをPOCOオブジェクトに追加し、そこからビットとピースを抽出することができ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));
}

次に、この「YourPOCO」タイプに基づいてASP.NET MVCビューまたは部分ビューを作成し、「List」テンプレートを使用して、リストのような表示で「YourPOCO」インスタンスのリストを作成できます。

マーク

于 2009-08-30T14:54:40.507 に答える
4

古い質問ですが、とにかくこれは誰かにとって役立つ可能性があります:

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です

于 2011-08-24T10:34:59.007 に答える
1

データアクセス層でのデータテーブルの使用に関する他の質問を見ました。ある時点でPOCOを返却する場合は、DALにすでにPOCOを返却させることをお勧めします。

SqlDataReaderを使用してPOCOを埋めます。これはより軽量です。エントリのリストにDataSetとDataTableを使用する方が簡単な場合もありますが、とにかく行をstronlyタイプのPOCOSに変換する場合は、これが最善の方法であると確信しています。

于 2009-08-30T20:01:18.910 に答える