2017-01-20 6 views
0

私は、その属性の1つとしてオブジェクト配列を持つモデルを持っています。例:C#でのストアドプロシージャからの配列オブジェクトを含むモデルの取得

class Person { 
int id; 
string name; 
int age; 
Work[] workExperiences; 
} 

class Work { 
int id; 
string address; 
string position; 
} 

PersonとWorkはデータベースのテーブルです。 1つのクエリですべての情報を取得できるようにストアドプロシージャを作成するにはどうすればよいですか?

答えて

0

使用しているデータベースサーバーの種類やデータベースに近づいていることを指定していないため(EntityFramework、さまざまなOR/M、直接SqlConnectionなど)、私は前提をしますMSSQL ServerSqlConnectionを使用しています。

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の行数で初期化することができます。

+0

ありがとうございます。あなたが正しいです、私はSqlConnectionを使用しています、私はそれを明確にしていない場合はごめんなさい。結果セットをループせずにWorkオブジェクトのリストを取得できると思っていました。あなたのソリューションは私を1トン助けました。 – franco

関連する問題