簡體   English   中英

如何使用 FromSqlRaw Entity Framework Core 3.1 從存儲過程返回多個 SELECT 集

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

我目前在從數據庫返回值時遇到問題,我正在使用 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();

問題是它應該返回多個多組,但它只返回一個通道。 我究竟做錯了什么?

提前致謝。

更新

在這種情況下,表中存在重復的主鍵。 盡管下面的 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM