C# 仅使用指定字段填充DbSet.Local

C# 仅使用指定字段填充DbSet.Local,c#,entity-framework,C#,Entity Framework,在LINQtoSQL中,为了减少查询时间,我只下载一部分字段进行处理。像这样的 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 M

在LINQtoSQL中,为了减少查询时间,我只下载一部分字段进行处理。像这样的

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.Local时,我很想从Linq2SQL转换过来,但是我似乎找不到这个新的简化缓存系统的版本,它允许我将查询范围缩小到特定的列。我该怎么办

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

对不起,答案是:不可能

原因是EF的内部缓存用于跟踪实体、完整实体。能够通过本地集合访问这些缓存的实体仅仅是DbContext API引入的额外功能。缓存因此不存在。缓存用于更改跟踪

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

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

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

因此,在这方面,您将不会从EF获得太多收益

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

对不起,答案是:不可能

原因是EF的内部缓存用于跟踪实体、完整实体。能够通过本地集合访问这些缓存的实体仅仅是DbContext API引入的额外功能。缓存因此不存在。缓存用于更改跟踪

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

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

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


因此,在这方面,您将不会从EF获得太多收益。

有趣。当我以这种方式缓存数据时,通常是为了编译报告或执行比较分析,但如果如您所说,Local仅用于更改跟踪,那么最好单独处理大多数只读操作。谢谢你的信息。很有趣。当我以这种方式缓存数据时,通常是为了编译报告或执行比较分析,但如果如您所说,Local仅用于更改跟踪,那么最好单独处理大多数只读操作。谢谢你的信息。