当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《它是否从数据库加载数据?》经验,为你挑选了1个好方法。

假设我们有这样的方法:

public IEnumerable 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设计器生成的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()在本地缓冲数据 - 但请注意,这会打破"组合" - 即调用者不能再添加额外的Whereetc子句(如果它返回raw,则可以使用它们IQueryable).


你的问题:

public IEnumerable 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是关键; 它结束了可组合IQueryable链,并在其余部分使用LINQ-to-Objects.



1> Marc Gravell..:

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

using包围foreach(在发动机罩)确保当连接被关闭foreach被放弃中途通.

如果你先加载数据,请使用.ToList().ToArray()在本地缓冲数据 - 但请注意,这会打破"组合" - 即调用者不能再添加额外的Whereetc子句(如果它返回raw,则可以使用它们IQueryable).


你的问题:

public IEnumerable 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是关键; 它结束了可组合IQueryable链,并在其余部分使用LINQ-to-Objects.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有