我有这样的实体
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;在数据阅读器中没有相应的列具有相同的名称
我知道如果我定义一个具有Id
,FirstName
的新实体并将存储过程结果映射到它,那么一切都很糟糕。
现在有没有办法将我的存储过程结果映射到Person Entity而不定义新实体?
答案 0 :(得分:2)
您可以让查询看起来像这样:
CREATE PROCEDURE [dbo].[GetPersons]
AS
SELECT Id, FirstName, '' as LastName, 0 as Age FROM [dbo].[Persons]
虽然他们仍然通过网络,但你并没有将它们从数据库中拉出来。
但是你现在使用Person代表两种不同的东西,这几乎总是一个坏主意。我认为你最好使用两个独立的对象,如果你有代码需要同时使用它们,可以在Id和FirstName上创建和接口。
我也很想知道你在做什么,拉出两个额外的列已被确定为性能瓶颈,拉动和不拉动柱之间有什么区别?或者是不成熟的优化?
答案 1 :(得分:0)
你有选择(虽然我不明白目的):
而不是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首先是值得怀疑的。