【问题标题】:EntityFrameWork: Map selection columns to an entityEntityFrameWork:将选择列映射到实体
【发布时间】:2015-07-20 10:03:07
【问题描述】:

我有这样的实体

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”在数据读取器中没有同名的对应列

我知道我是否定义了一个具有IdFirstName 的新实体并将存储过程结果映射到它,一切正常。 现在有什么方法可以在不定义新实体的情况下将存储过程结果映射到 Person Entity?

【问题讨论】:

  • 你为什么不直接使用select * from ...?它包含所有文件。
  • @afsharm 出于性能原因我想过滤我的选择列

标签: c# entity-framework stored-procedures


【解决方案1】:

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

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

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

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

我还想知道您在做什么,拉动两个额外的列已被确定为性能瓶颈,拉动和不拉动列有什么区别?还是过早的优化?

【讨论】:

    【解决方案2】:

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

    • 您可以简单地创建一个新的实体类,它只映射那些 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 首先是值得怀疑的。

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 2014-08-23
      相关资源
      最近更新 更多