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