开发者社区 问答 正文

单个存储过程中的多个模型

我正在使用SQL Server数据库和dapper。

作为单个存储库方法的一部分,我想从多个表中选择数据(请注意,我的两个表在没有相互关联的地方)。

我有两张桌子

User:名称varchar(max),代码varchar(max),街道varchar(max)
Student:姓名varchar(max),电话号码int,地址varchar(max)

我有一个存储库方法,GetDetails()使用它可以执行存储过程,并从单个方法中获取详细信息。

我的存储过程采用两个参数作为输入:

CREATE PROCEDURE GetDetails
    (@Code VARCHAR(MAX), @Number INT)
AS
    SELECT * FROM User WHERE code = @Code 
    SELECT * FROM Student WHERE number = @Number

我的存储库方法:

执行上面显示的存储过程 在Details模型中填写细节 详细模型如下所示:

public USER user { get; set; }
Public string Name { get; set; }
public string address { get; set; }

调试时,它不填写用户模型-它返回为空,但Name和address越来越充满。当我从SQL Server Management Studio执行存储过程时,它将返回预期的结果。

请说明用户对象失败的原因,而不是在我的“详细信息”模式下使用“名称”和“街道”代替“用户”。由于名称已存在于详细信息模型中,所以我无法区分它是学生还是用户。

请建议一些方法来处理此返回的SQL Server表的多个结果集。

展开
收起
祖安文状元 2020-01-04 15:58:31 498 分享 版权
阿里云 AI 助理回答

在Dapper中处理多结果集通常需要一些额外的步骤来确保每个结果集被正确映射到相应的对象。对于您的情况,您希望将两个独立的结果集分别映射到User和一个包含Nameaddress属性的模型上(注意这里似乎有个小错误,应该是Public Student student { get; set; }而不是Public USER user { get; set; },以保持一致性)。由于您的Details模型看起来是想合并这两个表的部分信息,但直接映射可能不直接适用,因为Dapper默认会尝试一对一地映射结果集到对象。

一种解决方案是创建一个自定义的多结果集处理方法,或者使用Dapper的多功能性来手动处理每个结果集。以下是一个示例代码,展示了如何从存储过程中获取多个结果集并填充到自定义的Details模型中:

首先,确认您的Details模型应该这样设计以区分用户和学生的信息:

public class Details
{
    public User User { get; set; }
    public Student Student { get; set; }
}

然后,在您的存储库方法中,您可以使用Dapper的QueryMultiple方法来处理多结果集:

using (var connection = new SqlConnection(_yourConnectionString))
{
    connection.Open();
    using (var multi = connection.QueryMultiple("GetDetails", new { Code = code, Number = number }))
    {
        var user = multi.Read<User>().SingleOrDefault(); // 或FirstOrDefault()取决于预期是否有数据
        var student = multi.Read<Student>().SingleOrDefault(); // 同上

        // 将查询结果组合到Details模型中
        var details = new Details { User = user, Student = student };
        
        return details;
    }
}

这段代码首先打开数据库连接,然后使用QueryMultiple执行存储过程,并通过Read<T>方法读取每一个结果集,将其转换为相应的实体类对象。最后,它将这些对象组合成一个新的Details实例返回。

请注意,如果存储过程中的任一查询可能返回多条记录,而您期望的是单个匹配项,那么应使用SingleOrDefault()来获取单个对象或null(如果没有匹配项),而不是Single(),后者会在没有找到或找到多于一条记录时抛出异常。

这种方法允许您清晰地区分来自不同表的数据,并且可以在Details模型中根据需要进一步处理或展示这些信息。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答