仅使用指定的字段填充DbSet <tentity> .Local

时间:2016-08-31 21:11:27

标签: c# entity-framework

在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切换,但我似乎无法找到这个新的简化缓存系统的版本,这允许我将查询范围缩小到具体栏目。我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

  

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

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

原因是EF的内部缓存用于跟踪实体完整实体。能够通过<ul class="list-group"> <li> <div class='items'> <label>Toggle me</label> <input type="checkbox"> </div> </li> <li> <div class='items'> <label>Longer text </label> <input type="checkbox"> </div> </li> <li> <div class='items'> <label>short</label> <input type="checkbox"> </div> </li> <li> <div class='items'> <label>hi</label> <input type="checkbox"> </div> </li> <li> <div class='items'> <label>more unjustified</label> <input type="checkbox"> </div> </li> </ul>集合访问这些缓存的实体只是Local API引入的一个额外奖励。缓存不存在,因为。缓存用于更改跟踪。

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

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

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

所以在这个方面,你通过转移到EF获得了很多收获。