c# - 如何使用 FromSqlRaw Entity Framework Core 3.1 从存储过程返回多个 SELECT 集

标签 c# sql-server asp.net-core stored-procedures entity-framework-core

我目前从数据库返回值时遇到问题,我正在使用 SQL Server 存储过程和 ASP.NET Core 3.1 来检索多个 SELECT 集。

这是我的存储过程:

ALTER PROCEDURE [dbo].[MyProc]
    @BusinessModelID int
AS
BEGIN
    SELECT Id, Title 
    FROM [dbo].[Channels] 
    WHERE BusinessModelId = @BusinessModelID;

    SELECT Id, Title 
    FROM [dbo].[Problems] 
    WHERE BusinessModelId = @BusinessModelID;

    SELECT Id, Title 
    FROM [dbo].[CostStructures] 
    WHERE BusinessModelId = @BusinessModelID;

    SELECT Id, Title 
    FROM [dbo].[CustomerSegments] 
    WHERE BusinessModelId = @BusinessModelID;

    SELECT Id, Title 
    FROM [dbo].[KeyMetrics] 
    WHERE BusinessModelId = @BusinessModelID;

    SELECT Id, Title 
    FROM [dbo].[RevenueStreams] 
    WHERE BusinessModelId = @BusinessModelID;

    SELECT Id, Title 
    FROM [dbo].[Solutions] 
    WHERE BusinessModelId = @BusinessModelID;

    SELECT Id, Title 
    FROM [dbo].[Unfairs] 
    WHERE BusinessModelId = @BusinessModelID;

    SELECT Id, Title 
    FROM [dbo].[Values] 
    WHERE BusinessModelId = @BusinessModelID;
END

这是我的 C# 代码:

var modelList = _dataContext.Set<BusinessToGet>()
                        .FromSqlRaw($"EXECUTE MyProc @BusinessModelID={businessModelId}")
                        .ToList();

问题是它应该返回多个集合,但它只返回一个 channel 。我做错了什么?

提前致谢。

最佳答案

更新

在这种情况下,表中存在重复的主键。尽管下面的 SQL 在 SQL-server 中运行良好,但 EF Core 返回了很多重复的实例,因为当 EF Core 看到一个 Id = 1 的实例时,它会将它用于所有 Id = 1 的后续实例。

解决方法是对 FromSqlRaw 查询使用无 key DTO。

[Keyless]
public class BlogPostsCount
{
Id, 
    public int Id { get; set; }
    public string Title { get; set; }
}

https://learn.microsoft.com/en-us/ef/core/modeling/keyless-entity-types?tabs=data-annotations


使用 UNION 应该可以解决这个问题。如果表之间的数据类型不同,您可能还需要强制转换列值才能获得统一的结果。如果您在多个表中有重复项,并且需要全部,请使用 UNION ALL

SELECT Id, Title FROM [dbo].[Channels] WHERE BusinessModelId = @BusinessModelID
UNION
SELECT Id,Title FROM [dbo].[Problems] WHERE BusinessModelId = @BusinessModelID
UNION
SELECT Id, Title FROM [dbo].[CostStructures] WHERE BusinessModelId = @BusinessModelID
UNION
SELECT Id, Title FROM [dbo].[CustomerSegments] WHERE BusinessModelId = @BusinessModelID
UNION
SELECT Id, Title FROM [dbo].[KeyMetrics] WHERE BusinessModelId = @BusinessModelID
UNION
SELECT Id, Title FROM [dbo].[RevenueStreams] WHERE BusinessModelId = @BusinessModelID
UNION
SELECT Id, Title FROM [dbo].[Solutions] WHERE BusinessModelId = @BusinessModelID
UNION
SELECT Id, Title FROM [dbo].[Unfairs] WHERE BusinessModelId = @BusinessModelID
UNION
SELECT Id, Title FROM [dbo].[Values] WHERE BusinessModelId = @BusinessModelID

关于c# - 如何使用 FromSqlRaw Entity Framework Core 3.1 从存储过程返回多个 SELECT 集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68153841/

相关文章:

c# - 我的 ViewData 如何可以为空,但可以在调试器中扩展?

c# - 为泛型类实现 IComparable<T> 接口(interface)以比较类型 T

sql-server - 执行 SQL 任务输出参数 vs ResultSet

javascript - 使用 javascript 将 HTML 页面与 SQL 服务器连接

c# - 显示记录是按 Name 还是 EmpID 查找

sql-server - 如何确定服务包应用于 SQL Server 实例的日期?

asp.net-core - 如何使用自定义服务在 ASP.NET Core 3.1 中注册身份验证提供程序?

c# - 如何自动增加 .NET Core 项目的版本(例如 “1.0.*” )?

c# - ASP NET Core Identity 中的 ai_user 和 ai_session cookie 是什么以及如何配置它?

C#嵌套 : How to index array of geo-poinst