C# EF代码在创建对象时首先迭代所有属性

C# EF代码在创建对象时首先迭代所有属性,c#,performance,entity-framework,ef-code-first,C#,Performance,Entity Framework,Ef Code First,我在应用程序中首先使用EF代码,并具有以下类别: [Table("TBL_XYZ")] public class XYZ { [Required] public string PropA { get; set; } [Required] public int PropB { get; set; } public int FormulaA { get

我在应用程序中首先使用EF代码,并具有以下类别:

   [Table("TBL_XYZ")]
    public class XYZ
    {
        [Required]
        public string PropA { get; set; }

        [Required]
        public int PropB  { get; set; }

        public int FormulaA 
        {
          get 
          {
            return PropB *  Math.PI / 100;
          }
        }
    }
这是我从数据库获取数据的方式:

var data = (from e in db.XYZ where e.PropB < 100 select e).ToList();
var data=(从db.XYZ中的e开始,其中e.PropB<100选择e);
在我添加了更多的字段来进行计算并且没有设置访问器(比如FormulaA)之后,我意识到在执行上述行时性能有所下降

经过一些调试,我发现EF迭代了所有属性。它在创建对象时调用属性的所有get函数,即使我不访问它们

这种行为的目的是什么?是否有解决办法。这可能与跟踪变化有关吗? 在对象本身中包含公式对我来说非常方便,但现在它严重影响了性能。

您可以尝试添加公式

[NotMapped]
public int FormulaA ....
并且在查询中只选择您真正需要的属性

select new {e.PropA, e.PropB}

NotMapped属性是一个好主意。但我也有一些属性,它们是公式,也应该存储在数据库中;这对NotMapped不起作用。有趣的案例。第二个变量和仅使用加载的数据初始化您的类型如何?我不确定是否理解“仅使用加载的数据初始化您的类型”?你的意思是“选择新的{e.PropA,e.PropB}”吗?是的,首先只将PropA,PropB加载到匿名类型,然后再转换到您类型的对象。。。选择(x=>newxyz(x.PropA,x.PropB))。诸如此类,但我不确定这会更快:)我真的很感谢你的帮助。但还有一个问题:我的类有很多属性(大约100个),我不想列出所有属性。更重要的是,我不希望每次添加新属性时都在代码中的不同位置添加属性(这将在将来发生)。