使用Load()
加载记录后,我不知道这些记录要去哪里。这些记录从哪里加载?是否可以从layers
或tmp1
变量访问它们?最终,该方法返回layers
变量,但query
和dbContext的情况似乎不会影响layers
变量:
var layers = dbContext.DataLayer.Where(x => layerIds.Contains(x.DataLayerId)).ToList();
var tmp1 = dbContext.XYDateRelationshipUnderDI
.Where(x => x.XYDatedDI.Dated && layerIds.Contains(x.XYDatedDI.DataFeature.LayerId))
.ToList()
.Select(x => x.XYRelationshipId);
var query = dbContext.XYValueHolder
.Where(x => tmp1.Contains(x.XYRelationshipId))
.Where(x => x.XYValues.Count > 0);
// ...
query.Where(x => x.XYValues.Average(x => x.X) > item.ThresholdValue).Load();
// ...
dbContext.XYDatedDI
.Where(x => tmp1.Contains(x.XYRelationshipUnderDI.XYRelationshipId)).Load();
return layers;
我在网上看到的大多数例子都与对单个实体或DbSet使用Load方法有关。我是C#和实体框架的初学者,所以我正在调试的文件中的这段代码让我有点困惑。
更改跟踪器跟踪从数据库加载的每个对象实例。加载对象时,更改跟踪器会根据外键值将导航属性链接在一起。
例如,如果您的layers
变量包含具有外键的对象,这些外键指向其他.Load()
调用加载的任何对象,则相关对象将在内存中链接。
然后,当您修改对象的属性时,更改跟踪器会检测您的更改,然后用于生成sql,将这些更改应用于数据库。
您可以从context.ChangeTracker.Entries()
检查更改跟踪器中的所有对象,或者通过context.dbset.Local
通过其DbSet查询加载的实例。
检查以下内容:
https://stackoverflow.com/a/18032219/1559611
DbContext
是一个实体框架对象,它产生了IQueryable<T>
,它就像查询数据的游标,它实时执行查询,通过游标访问。
现在,可以选择将IQueryable<T>
转换为IEnumerable<T>
,这是基本接口,指的是在内存中加载数据。
当您调用.Load()
或.ToList()
时,数据会像List<T>
一样一次加载到内存结构中。使用类似Load()
的东西的唯一好处是子数据,并且通过使用Include
,引用的数据也会加载到内存中以进行快速访问
也检查一下:
DbContext显式加载
因此,区别在于显式加载内存结构或通过光标访问内存结构(延迟加载),这两种机制都有其优缺点和特定的用例。
这两个数据点都是特定于调用的,一旦调用结束,它们就会消失,直到并且除非有缓存来检索它,但通常缓存对于内存中的数据很有用,比如dbcontext连接池在内部使用,以避免代价高昂的重新初始化。
-
加载到内存中的数据在各种操作中都很快,因为没有网络调用,所有网络惩罚都是一次性加载数据。
-
对于基于光标的方法,有一个网络调用来获取每个数据单元,尽管它很小,可以分块以避免过多的网络调用,但应用程序只能处理加载在内存中的数据