【问题标题】:NotMapped property causes all properties load in select statement in EF CoreNotMapped 属性导致在 EF Core 的 select 语句中加载所有属性
【发布时间】:2021-04-13 05:33:51
【问题描述】:

我在一个项目中使用 EF Core 5,我的一个实体包含一个 NotMapped 属性,该属性混合了实体的两个属性,我希望在 select 语句中只有包含在 select 语句中的属性从数据库加载但在分析之后,我已经看到所有属性都已加载。

作为示例,Contact 实体包含一个 NotMapped 属性,如下所示。

public class Contact
{
    public int ContactId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    [NotMapped]
    public string FullName => $"{FirstName} {LastName}";
    public string Email { get; set; } 
    public string Phone { get; set; } 
    public string Address { get; set; } 
}

public class SampleContext : DbContext
{
    public DbSet<Contact> Contacts { get; set; }
}

在下面的查询中,我只需要 ContactId 和 FullName,我希望在 TSQL 查询中只加载 ContactId、FirstName、LastName,但所有属性都已加载。

var list = dbContext.Contacts.Select( e => new
    {
        e.ContactId,
        e.FullName
    }).ToList();

【问题讨论】:

    标签: c# entity-framework .net-core entity-framework-core


    【解决方案1】:

    如果您只想加载一些列,您可以:

    var list = dbContext.Contacts
        .Where(...)
        .Select( e => new
        {
            e.ContactId,
            LastName = e.FirstName + " " + e.LastName
        })
        .ToList() // hit the database 
    

    【讨论】:

    • 因为我想在具有不同选择的多个查询中使用 FullName,所以我不想在任何地方编写该代码。我在问题中的代码是我需要的示例
    【解决方案2】:

    我真的很惊讶这个运行。 NotMapped 的全部意义在于表明该列未绑定,甚至不应该在 Select 或任何其他 Linq 表达式中使用。尝试使用 EF 6 会导致错误。您的选择是:

    A) 选择实体并使用您声明的客户端计算属性。 (基本上你的代码在幕后做什么)

    B) 按照 tymtam 的建议,计算匿名类型的属性。

    var list = dbContext.Contacts
        .Where(...)
        .Select( e => new
        {
            e.ContactId,
            LastName = e.FirstName + " " + e.LastName
        }).ToList() // hit the database 
    

    EF Core 引入了客户端评估,它在早期版本中默认启用,但我相信自 EF Core 3 以来默认禁用...这个问题闻起来要么是您启用了客户端评估,要么是 EF Core 中的错误5 仍然恢复到未映射属性的客户端评估。无论哪种方式,我都不知道将属性标记为“客户端计算”,因为这只有在属性被声明为表达式(而不是有效地string.Format)时才可能起作用,因此您的选择是上述两个中的一个,或者依赖看起来是客户端评估的东西,这要么是您的项目已配置的东西(并且可能会在路上咬你一口),要么是一个可能“修复”并在未来某个时候停止工作的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-07
      • 2022-01-04
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      相关资源
      最近更新 更多