如何使用 FromSqlRaw Entity Framework Core 3.1 从存储过程 return 多个 SELECT 集合

How to return multiple SELECT sets from a stored procedure using FromSqlRaw Entity Framework Core 3.1

我目前的 returning 数据库值有问题,我正在使用 SQL 服务器存储过程和 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();

问题是它应该 return 多组,但它只是 return 一个通道。我做错了什么?

提前致谢。

更新

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

的后续实例

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

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

https://docs.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