EntityFrameWork:将选择列映射到实体

本文关键字:映射 实体 选择 EntityFrameWork | 更新日期: 2023-09-27 18:03:37

我有一个这样的实体

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]");

数据读取器与指定的'..'不兼容。类型'LastName'的成员在数据读取器中没有相同名称的对应列

我知道如果我定义一个具有Id, FirstName的新实体,并将存储过程结果映射到它,一切都是正常的。现在是否有任何方法可以将存储过程结果映射到Person Entity而无需定义新实体?

EntityFrameWork:将选择列映射到实体

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

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

您没有从数据库中提取它们,尽管它们仍然通过网络传输。

但是您现在使用Person来表示两种不同的东西,这几乎总是一个坏主意。我认为你最好有两个单独的对象,也许创建和Id和FirstName的接口,如果你有代码需要与两者一起工作。

我也想知道你在做什么,拉两个额外的列已被确定为性能瓶颈,拉和不拉列之间的区别是什么?或者这是一个过早的优化?

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

  • 你可以简单地创建一个新的实体类,只映射那些2列。
  • 您可以使用dynamic作为类型(那么您将丢失)至少对结果集的智能感知)。
  • 你可以代替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和SP首先是值得怀疑的。