我有一个模型,它有一个对象数组作为其属性之一。例如:
class Person {
int id;
string name;
int age;
Work[] workExperiences;
}
class Work {
int id;
string address;
string position;
}
Person and Work是数据库中的表。如何创建存储过程以便在一个查询中检索所有信息?
答案 0 :(得分:0)
由于您没有指定您正在使用的数据库服务器类型,或者您以何种方式接近数据库(www.url.com/start=2017-01-28&end=2017-01-29
,各种OR / M,直接{{1 }},...)我会假设你正在使用EntityFramework
和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>
是SQL中的保留字,因此将列命名为不良做法。
WorkAddress
现在你有一个address
。你现在可以按照
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
的行数来初始化它。