[英]How to return multiple SELECT sets from a stored procedure using FromSqlRaw Entity Framework Core 3.1
I am currently having an issue with my returning values from the DB, I am using a SQL Server stored procedure and ASP.NET Core 3.1 to retrieve several SELECT sets.我目前在从数据库返回值时遇到问题,我正在使用 SQL Server 存储过程和 ASP.NET Core 3.1 来检索多个 SELECT 集。
Here's my stored procedure:这是我的存储过程:
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
And here's my C# code:这是我的 C# 代码:
var modelList = _dataContext.Set<BusinessToGet>()
.FromSqlRaw($"EXECUTE MyProc @BusinessModelID={businessModelId}")
.ToList();
The problem is that it should return several multiple sets but it is only returning one the Channels.问题是它应该返回多个多组,但它只返回一个通道。 What am I doing wrong?
我究竟做错了什么?
Thanks in advance.提前致谢。
Update更新
In this case, there was duplicate primary keys across tables.在这种情况下,表中存在重复的主键。 Even though SQL below worked well in SQL-server, EF Core returned a lot of duplicate instances due to the fact that when EF Core sees an instance with Id = 1, it uses that for all sub-sequent instances with Id = 1.
尽管下面的 SQL 在 SQL-server 中运行良好,但 EF Core 返回了大量重复实例,因为当 EF Core 看到一个 Id = 1 的实例时,它会将它用于所有 Id = 1 的后续实例。
A work-around is to use a keyless DTO for FromSqlRaw
queries.解决方法是对
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 https://docs.microsoft.com/en-us/ef/core/modeling/keyless-entity-types?tabs=data-annotations
Using UNION should solve this issue.使用UNION应该可以解决这个问题。 If datatypes varies between tables, you may need to cast column values as well in order to make a uniform result.
如果表之间的数据类型不同,您可能还需要转换列值以获得统一的结果。 If you have duplicates across tables, and needs all, use UNION ALL .
如果跨表有重复项,并且需要全部,请使用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.