使用しているデータベースサーバーの種類やデータベースに近づいていることを指定していないため(EntityFramework
、さまざまなOR/M、直接SqlConnection
など)、私は前提をしますMSSQL Server
とSqlConnection
を使用しています。
GetPersonAndWorkExperience
と呼ばれる非常に単純なストアドプロシージャの引数として、PersonID
が使用されているとします。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE GetPersonAndWorkExperience
@PersonID INT
AS
BEGIN
SELECT
p.PersonID,
p.Name,
p.Age,
w.WorkID,
w.WorkAddress,
w.Position
FROM Person p
INNER JOIN Work w ON w.WorkID = p.PersonID
WHERE p.PersonID = @PersonID
END
GO
これは、必要なすべての結果セットを返します。
SqlConnection
でデータベースに近づいている場合、これはストアドプロシージャを呼び出して、質問に指定されたモデルクラスを使用してデータを返す方法です。便宜上、配列をList<Work>
に変換しています。 address
はSQLの予約語なので、アドレスの名前をWorkAddress
に変更しています。そのように列名を付けるのは悪い習慣です。
public DataTable GetPersonAndWorkExperience(int personId)
{
string connectionString = ""; //load connection string here
DataTable result;
using (SqlConnection conn = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand("dbo.GetPersonAndWorkExperience"))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@PersonID", personId));
conn.Open();
cmd.Connection = conn;
using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
result = new DataTable();
result.Load(rdr);
}
}
}
return result;
}
ここではDataTable
があります。あなたは今、これはそれの要点を示し、それは、テキストエディタで書かれていますが、アイデアを得るたとしてコンパイルされない場合があることにご注意ください
Person p = new Person
{
Id = int.Parse(dt.Rows[0].Columns["PersonID"]),
Name = dt.Rows[0].Columns["Name"]),
Age = int.Parse(dt.Rows[0].Columns["Age"])
};
p.WorkExperiences = new List<Work>();
List<Work> workExperiences = (from row in dt.AsEnumerable()
select new Work
{
Id = row.Field<int>("WorkID"),
WorkAddress = row.Field<string>("WorkAddress"),
Position = row.Field<string>("Position")
}).ToList();
p.WorkExperiences.AddRange(workExperiences);
の線に沿って何かを行うことができます。
本当に配列を保持したい場合は、もちろんDataTable
の行数で初期化することができます。
ありがとうございます。あなたが正しいです、私はSqlConnectionを使用しています、私はそれを明確にしていない場合はごめんなさい。結果セットをループせずにWorkオブジェクトのリストを取得できると思っていました。あなたのソリューションは私を1トン助けました。 – franco