EntityFrameWork:将选择列映射到实体

时间:2015-07-20 10:03:07

标签: c# entity-framework stored-procedures

我有这样的实体

public class Person
{
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public int Age { get; set; }
   public int Id { get; set; }
}

并有一个存储过程

CREATE PROCEDURE [dbo].[GetPersons] 
AS 
    SELECT Id,FirstName FROM [dbo].[Persons] 

当我在My DbContext中调用此存储过程时

var dataResult1 = dbContext.SqlQuery<Person>("[dbo].[GetPersons]");
  

数据阅读器与指定的&#39; ..&#39;不兼容。该类型的成员&#39; LastName&#39;在数据阅读器中没有相应的列具有相同的名称

我知道如果我定义一个具有IdFirstName的新实体并将存储过程结果映射到它,那么一切都很糟糕。 现在有没有办法将我的存储过程结果映射到Person Entity而不定义新实体?

2 个答案:

答案 0 :(得分:2)

您可以让查询看起来像这样:

CREATE PROCEDURE [dbo].[GetPersons] 
AS 
    SELECT Id, FirstName, '' as LastName, 0 as Age FROM [dbo].[Persons] 

虽然他们仍然通过网络,但你并没有将它们从数据库中拉出来。

但是你现在使用Person代表两种不同的东西,这几乎总是一个坏主意。我认为你最好使用两个独立的对象,如果你有代码需要同时使用它们,可以在Id和FirstName上创建和接口。

我也很想知道你在做什么,拉出两个额外的列已被确定为性能瓶颈,拉动和不拉动柱之间有什么区别?或者是不成熟的优化?

答案 1 :(得分:0)

你有选择(虽然我不明白目的):

  • 你可以简单地创建一个只能映射那些的新Entity类 2列。
  • 你可以使用动态作为类型(然后你会失败 至少对结果集进行智能感知)。
  • 而不是SP 将其创建为内联表值函数:

    CREATE FUNCTION [dbo].[GetPersons] ()
    RETURNS TABLE AS RETURN
    (
       SELECT Id,FirstName FROM [dbo].[Persons] 
    );
    

然后你的代码可能看起来像这样:

var dataResult1 = dbContext.SqlQuery<Person>(@"Select Id, FirstName, 
    '' as LastName, 0 as Age 
    FROM [dbo].[GetPersons]()");
像这样的OTOH首先是值得怀疑的。