Asp.Net MVCでデータテーブルをPOCOオブジェクトに変換するにはどうすればよいですか?
4 に答える
各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"];
}
...
}
}
データテーブルには通常、多くの行が含まれています。各行をオブジェクトインスタンスに変換しますか?
その場合、たとえば、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」インスタンスのリストを作成できます。
マーク
古い質問ですが、とにかくこれは誰かにとって役立つ可能性があります:
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;
}
データアクセス層でのデータテーブルの使用に関する他の質問を見ました。ある時点でPOCOを返却する場合は、DALにすでにPOCOを返却させることをお勧めします。
SqlDataReaderを使用してPOCOを埋めます。これはより軽量です。エントリのリストにDataSetとDataTableを使用する方が簡単な場合もありますが、とにかく行をstronlyタイプのPOCOSに変換する場合は、これが最善の方法であると確信しています。