【发布时间】:2016-12-11 17:57:21
【问题描述】:
我有一个带有 SQL Server 后端的 WebAPI 服务,它使用实体框架(代码优先)进行管理。我使用 Linq 查询从数据库中检索数据。由于我的一些 API 端点执行多个连接来获取数据,因此在生产中部署时我观察到了一些延迟。我阅读了使用 ORM 映射与直接 SQL 查询(存储过程)并得出结论,对于复杂查询,使用存储过程是最佳选择。
我看到几篇文章解释了如何使用如下代码从存储过程中返回值:
context.Database.SqlQuery<T>(...)
但是,所有示例都处理简单的 SELECT 查询,是的,我也遇到了返回多个 SELECT 查询结果。但在这种情况下,它是 2 个SELECT 查询。
在实际场景中,可能会涉及到 2 个以上的 select 查询,因为它可能涉及到 join 和其他代码。而且,在查询结束时,我们将推导出最终的SELECT 查询,它返回预期的数据。下面是一个示例模型代码来解释这个场景:
// Inside my stored procedure
Declare @XId uniqueidentifier
Declare @YId uniqueidentifier
// Some mockup queries. This can have JOINS and other complex codes in real code.
// Below code is made as simple as possible to explain the scenario
Select @XId=Id From Table1 Where Name = 'Name1'
Select @YId=Id From Table2 Where Code = 'Code1'
// This is the data, I am interested
Select * From Table3 Where Col1Id=@XId And Col2Id=@YId
如何从最后一个 SELECT 查询中获取行以实现此目的?
我做了一些研究并假设它不可能使用 EF,因为存储过程支持很少。这是否可以在 EF 限制内完成,或者我是否需要为此回退到 ADO.NET?
任何帮助将不胜感激。
谢谢。
【问题讨论】:
-
@GertArnold - 我添加了示例代码 sn-p 来解释场景。
-
我认为您应该将
Select *替换为Select [your actual columns list],这样您才能真正知道自己在使用什么。然后创建一个类型MyResultType,其属性与所选列匹配并调用context.Database.SqlQuery<MyResultType>(...)。 -
是的,我已经尝试过了,但它正在转换为
Table1DTO而不是Table3DTO,这当然会引发转换错误。
标签: c# entity-framework linq