C# 处理大型存储过程reults

C# 处理大型存储过程reults,c#,entity-framework,C#,Entity Framework,所以我正在开发一个每天运行一次的windows服务。该服务用于将外部数据库中的数据合并到我的数据库中。问题是我只能通过存储过程访问外部数据库 当我使用其中一个存储过程时,它返回120万个对象,而我的服务的ram使用量上升到2.5GB 仅供参考:我正在使用EF 6,外部数据库先使用DB,数据库先使用代码 下面方法中的GetArt()是实体框架创建的存储过程之一,它返回120万个对象 public List<GetArt_Result> GetArtls() {

所以我正在开发一个每天运行一次的windows服务。该服务用于将外部数据库中的数据合并到我的数据库中。问题是我只能通过存储过程访问外部数据库

当我使用其中一个存储过程时,它返回120万个对象,而我的服务的ram使用量上升到2.5GB

仅供参考:我正在使用EF 6,外部数据库先使用DB,数据库先使用代码

下面方法中的GetArt()是实体框架创建的存储过程之一,它返回120万个对象

public List<GetArt_Result> GetArtls()
    {
        List<GetArt_Result> results = new List<GetArt_Result>();
        using (ExternalContext context = new ExternalContext()) {
            results = context.GetArt().ToList();
        }

        return results;
    }



public void SaveArticles(List<GetArt_Result> externalArtls)
    {
        try {
            List<Article> artls = new List<Article>();
            foreach (var artl in externalArtls) {
                artls.Add(new Article(artl));
            }
            using (DbContext context = new DbContext()) {
                context.BulkInsert(artls);
            }
        } catch (Exception ex) {
            throw ex;
        }
    }
公共列表GetArtls()
{
列表结果=新列表();
使用(ExternalContext=new ExternalContext()){
结果=context.GetArt().ToList();
}
返回结果;
}
公共作废保存项目(列出外部项目)
{
试一试{
List artls=新列表();
foreach(外部艺术中的var artl){
添加(新条款(artl));
}
使用(DbContext context=new DbContext()){
上下文插入(artls);
}
}捕获(例外情况除外){
掷骰子;
}
}

我的问题:如何在没有高ram使用率的情况下处理120万个对象?

在这种情况下,您最好尝试使用非缓冲读取器API,这样您就不需要一次缓冲内存中的所有对象。我不知道
context.GetArt()
返回什么,但是如果这已经是
IEnumerable
,那么您可能已经可以访问它了;然后,您可以迭代该数据(
foreach
),以执行您需要执行的任何操作,而不必一次将所有数据存储在内存中。如果
GetArt()。例如,使用“dapper”,这可以是
Query
指定可选的
buffered:false
参数(它默认为
true
,因为这对于大多数用例来说都很好)


但是,请注意,这里的关键点是:您不能将它们放入
列表中。当你这样做的时候,它需要缓冲。类似地,类似于
OrderBy
(应用于序列而非查询时)的操作会导致缓冲。

或者,您可以研究纯数据库解决方案,例如从windows服务在数据库上运行过程,这些SP将在外部数据库上调用过程