从C#中的存储过程中使用数组对象检索模型

时间:2017-01-20 08:30:12

标签: c# asp.net

我有一个模型,它有一个对象数组作为其属性之一。例如:

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

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

Person and Work是数据库中的表。如何创建存储过程以便在一个查询中检索所有信息?

1 个答案:

答案 0 :(得分:0)

由于您没有指定您正在使用的数据库服务器类型,或者您以何种方式接近数据库(www.url.com/start=2017-01-28&end=2017-01-29 ,各种OR / M,直接{{1 }},...)我会假设你正在使用EntityFrameworkSqlConnection

假设您有一个名为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的行数来初始化它。