假设我们有这样的方法:
public IEnumerableFirstMethod() { var entities = from t in context.Products where {some conditions} select t; foreach( var entity in entities ) { entity.SomeProperty = {SomeValue}; yield return entity; } }
其中context是由Linq to SQL设计器生成的DataContext.
"FirstMethod"是否将数据从数据库加载到内存中(因为foreach循环)或者它是否仍会延迟加载它,直到另一个没有"yield return"的foreach循环在另一个方法中找到,如下所示?
public void SecondMethod() { foreach( var item in FirstMethod() ) { {Do Something} } }
Marc Gravell.. 6
后者(延期); FirstMethod
是一个迭代器块(因为yield return
); 这意味着你有一系列迭代器.在最终调用者开始迭代数据之前,不会读取任何内容; 然后在最终调用者 foreach
(连接/命令打开之间)依次读取每个记录.
的using
包围foreach
(在发动机罩)确保当连接被关闭foreach
被放弃中途通.
如果你想先加载数据,请使用.ToList()
或.ToArray()
在本地缓冲数据 - 但请注意,这会打破"组合" - 即调用者不能再添加额外的Where
etc子句(如果它返回raw,则可以使用它们IQueryable
).
你的问题:
public IEnumerableFirstMethod() { var entities = from t in context.Products where {some conditions} select t; foreach( var entity in entities.AsEnumerable() ) { entity.SomeProperty = {SomeValue}; yield return entity; } }
这AsEnumerable
是关键; 它结束了可组合IQueryable
链,并在其余部分使用LINQ-to-Objects.
后者(延期); FirstMethod
是一个迭代器块(因为yield return
); 这意味着你有一系列迭代器.在最终调用者开始迭代数据之前,不会读取任何内容; 然后在最终调用者 foreach
(连接/命令打开之间)依次读取每个记录.
的using
包围foreach
(在发动机罩)确保当连接被关闭foreach
被放弃中途通.
如果你想先加载数据,请使用.ToList()
或.ToArray()
在本地缓冲数据 - 但请注意,这会打破"组合" - 即调用者不能再添加额外的Where
etc子句(如果它返回raw,则可以使用它们IQueryable
).
你的问题:
public IEnumerableFirstMethod() { var entities = from t in context.Products where {some conditions} select t; foreach( var entity in entities.AsEnumerable() ) { entity.SomeProperty = {SomeValue}; yield return entity; } }
这AsEnumerable
是关键; 它结束了可组合IQueryable
链,并在其余部分使用LINQ-to-Objects.