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而无需定义新实体?
你可以让你的查询看起来像这样:
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首先是值得怀疑的。