它是否从数据库加载数据?

时间:2009-01-27 14:16:15

标签: c# .net linq-to-sql

假设我们有这样的方法:

public IEnumerable<T> FirstMethod()
{
    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 designer生成的DataContext。

“FirstMethod”是否会将数据从数据库加载到内存中(因为foreach循环),或者它是否仍会延迟加载,直到另一个没有“yield return”的foreach循环在另一个方法中找到,如下所示?

public void SecondMethod()
{
    foreach( var item in FirstMethod() )
    {
        {Do Something}
    }
}

3 个答案:

答案 0 :(得分:6)

后者(延期); FirstMethod是一个迭代器块(因为yield return);这意味着你有一系列迭代器。在最终调用者开始迭代数据之前,不会读取任何内容;然后在最终调用者的 foreach期间(连接/命令打开之间)依次读取每条记录。

围绕using的{​​{1}}(在发动机罩下)可确保在foreach被中途放弃时关闭连接。

如果您想要以前加载数据,请使用foreach.ToList()在本地缓冲数据 - 但请注意,这会破坏“组合” - 即调用者可以不再添加额外的.ToArray() etc子句(如果它返回原始Where,则可以使用它们。)


重新提问:

IQueryable<T>

public IEnumerable<T> FirstMethod() { 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链,并在其余部分使用LINQ-to-Objects。

答案 1 :(得分:2)

简而言之,在SecondMethod执行迭代之前它不会加载...

阅读here了解更多信息......

答案 2 :(得分:1)

延迟加载,直到实体查询调用 GetEnumerator 方法,并且在调用 GetEnumerator 方法之前不会发生 IEnumerable&lt; T&gt; 你要回来了。