C# 实体框架4.1中的存储过程动态sql

C# 实体框架4.1中的存储过程动态sql,c#,entity-framework-4.1,C#,Entity Framework 4.1,根据参数执行不同的resultset时出现问题。 我有一个sp,它根据参数执行两个查询,两个查询执行一次,例如: CREATE PROCEDURE [dbo].[ShowMessages] @context int, AS BEGIN --CALENDAR ADMIN QUEUE if @context = 1 BEGIN Select CustomerName, CustomerA

根据参数执行不同的resultset时出现问题。 我有一个sp,它根据参数执行两个查询,两个查询执行一次,例如:

CREATE PROCEDURE [dbo].[ShowMessages]        
    @context  int,
AS
      BEGIN
      --CALENDAR ADMIN QUEUE
      if @context = 1 
            BEGIN
             Select CustomerName, CustomerAddress from Customer
            END
      ELSE if @queueContext = 2  OR @queueContext = 6
            BEGIN
             Select EmployeeName, EmployeeAddress from Employee
            END
END
=== 我用我的复杂类型映射了它:EF生成了带有两个字段的复杂类型
CustomerName
CustomerAddress
。EF抛出
IDataReader
的错误。但即使是我第一次查询时也很少出现这种错误


如何实现此功能?

根据“上下文”,SP返回的表中的列名会有所不同,因此EF只能将它们映射到其中一个上下文中的实体属性。从同一存储过程返回不同的列名是一种不好的做法,因此您需要做的是使它们在所有上下文/场景中保持一致

您可以使用AS关键字来执行此操作,如:

SELECT CustomerName AS Name, CustomerAddress AS Address FROM Customer


感谢您的快速响应,但在我的案例中,存在架构义务,是否有任何确凿的证据证明这是不可能的?不需要任何证据。EF在设计时将列名从结果集映射到复杂类型的属性名,并且只能进行一组映射。因此,您可以映射第一个或第二个查询,但不能同时映射这两个查询。对查询中的列使用相同的名称,或者使用两个不同的SP并根据上下文值调用它们。我没有确凿的证据,但我怀疑EF能否处理这种情况,因为这有点不寻常。当你说这是一项义务时,这是否意味着你不能改变SP?如果是这样,您可能需要编写另一个SP来包装此SP,并按照我的建议在该SP中规范化名称。
SELECT EmployeeName AS Name, EmployeeAddress AS Address FROM Employee