【发布时间】:2019-11-22 15:00:44
【问题描述】:
在使用数据在 C# 中构建模型时,我正在尝试确定如何处理我的数据库中的一对多关系。理想情况下,我想对数据库进行一次调用。但是,似乎可能需要两个(或更多)调用。
为简单起见,假设我的表格如下所示...
CREATE TABLE [dbo].[Users]
(
[userId] INT PRIMARY KEY IDENTITY(0,1),
[userName] NVARCHAR(500) NOT NULL
)
CREATE TABLE [dbo].[Tasks]
(
[taskId] INT PRIMARY KEY IDENTITY(0,1),
[description] NVARCHAR(1000) NOT NULL,
[userId] INT FOREIGN KEY REFERENCES [dbo].[Users](userId)
)
所以每个用户可以有很多任务。我有一个存储过程,它将返回用户的详细信息,看起来像这样......
CREATE PROCEDURE [dbo].[sp_GetUserDetail]
@userId INT
AS
BEGIN
SELECT
[dbo].[Users].[userName] AS 'User',
[dbo].[Tasks].[description] AS 'Task Description'
FROM
[dbo].[Users]
INNER JOIN
[dbo].[Tasks]
ON
[dbo].[Tasks].[userId] = [dbo].[Users].[userId]
WHERE
[dbo].[Users].[userId] = @userId
END
此过程返回与分配给用户的任务一样多的行。我要填充的模型看起来像这样。
public interface User
{
string Name { get; set; }
List<string> Tasks { get; set; }
}
我的选择如下:
- 使用此代码,并遍历从数据库返回的行以构建任务列表。
- 调用一个存储过程以返回用户表中的数据,然后调用另一个存储过程从任务表中获取数据。
- 某些(我不知道的魔法)方法可以让单个存储过程在一行中返回所有数据。
- 其他一些我什至不知道的选项。
经验丰富的开发人员通常如何处理此问题?
【问题讨论】:
-
另一种选择是使用 DataTable 代替 List
并让查询填充该 DataTable。
标签: c# sql database stored-procedures