如何使用 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
我目前的 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