填充数据库集<;TEntity>;.仅具有指定字段的本地

本文关键字:字段 数据库 lt TEntity 填充 gt | 更新日期: 2023-09-27 18:05:07

在Linq-to-Sql中,为了减少查询时间,我只下载字段的子集进行处理。像这样的。。。

var local_data = from row in context.MyTable
select new {
    ID = row.ID,
    Name = row.Name,
    EMAIL = row.EMAIL
};

然后我会简单地将投影数据转换为POCO集合。。。

foreach(var item in local_data){
    collection.Add(
        new MyTable(){
            ID = item.ID,
            NAME = item.NAME,
            EMAIL = item.EMAIL
        };
    );
}

当处理大量、笨拙的表记录时,这非常有用,因为我只想提取少数列。当我听说DbSet<TEntity>.Local时,我很想从Linq2SQL切换过来,但我似乎找不到这个新的精简缓存系统的版本,它允许我将查询范围缩小到特定的列。我该怎么做?

填充数据库集<;TEntity>;.仅具有指定字段的本地

允许我将查询范围缩小到特定列的缓存系统

对不起,答案是:不可能。

原因是EF的内部缓存用于跟踪实体,完整实体。能够通过Local集合访问这些缓存的实体只是DbContext API引入的额外功能。缓存不存在,因为它的。缓存用于跟踪更改。

当EF从数据库中具体化实体时,它将其原始值存储到更改跟踪器中,并经常存储其当前值的副本。当需要保存更改时,会比较这些值,并相应地生成SQL语句来存储更改。

现在您知道了这一点,您就会明白EF不能将参与方填充的实体存储到其缓存中。如果一个实体可以随机收集原始值和当前值,EF应该如何进行更改跟踪?

此外,投影--select new-的结果永远不会被跟踪(缓存(,因此无法通过Local集合访问。

因此,在这个方面,你不会因为转到EF而获得太多好处。