![](/img/trans.png)
[英]Entity Framework Core 3.1 Return value (int) from stored procedure
[英]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.