2

私は 20 万件のレコードをクエリしており、サーバーのメモリをすべて使い果たしています (驚くことではありません)。私はLINQを初めて使用するので、役立つはずの次のコードを見つけましたが、使用方法がわかりません。

public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> collection, int batchSize)
{
    List<T> nextbatch = new List<T>(batchSize);
    foreach (T item in collection)
    {
        nextbatch.Add(item);
        if (nextbatch.Count == batchSize)
        {
            yield return nextbatch;
            nextbatch = new List<T>(batchSize);
        }
    }
    if (nextbatch.Count > 0)
        yield return nextbatch;
}

ソース: http://goo.gl/aQZIj

「メモリ不足」エラーを作成するコードは次のとおりです。新しいバッチ関数をコードに組み込むにはどうすればよいですか?

var crmMetrics = _crmDbContext.tpm_metricsSet.Where(a => a.ModifiedOn >= lastRunDate);

foreach (var crmMetric in crmMetrics)
{
    metric = new Metric();                                
    metric.ProductKey = crmMetric.tpm_Product.Id;
    dbContext.Metrics.Add(metric);
    dbContext.SaveChanges();
}
4

2 に答える 2

1

Linq の Skip と Take を使用してバッチを取得します

これをチェックしてください:

http://www.c-sharpcorner.com/UploadFile/3d39b4/take-and-skip-operator-in-linq-to-sql/

于 2013-06-22T20:56:07.887 に答える