IQueryable批处理机制不检索小批量的所有信息

时间:2017-07-12 14:05:41

标签: c# linq nhibernate

我有一个简单的批处理机制,它将从原始数据库中获取X实体,然后将它们插入临时数据库。

批处理和插入功能:

    public IEnumerable<Article> GetEntitiesBatch(int startingId, int chunk)
    {
        return _session.Query<Article>()
                        .Where(x => x.Id > startingId)
                        .OrderBy(x => x.Id)
                        .Take(chunk).ToList();
    }

    public void InsertTemporaryArticles(List<Article> articles)
    {
        using (var transaction = _statelessSession.BeginTransaction())
        {
            _statelessSession.SetBatchSize(articles.Count);
            articles.ForEach(ac => _statelessSession.Insert(ac));
            transaction.Commit();
        }
    }

主要功能的代码流程:

    private void ProcessBatch(int idToCheck)
    {
        do
        {
            var articles = GetEntitiesBatch(idToCheck, batchSize).ToList();

            if (!articles.Any())
            {
                return;
            }

            InsertTemporaryArticles(articles);

            // Still more to check. Can continue.
            if (articles.Count == batchSize)
            {
                idToCheck = articles.Last().Id;
            }
            else
            {
                return;
            }          
        } while (true);
    }

假设我的原始表有7500个元素(文章)。我一直得到这个值为1000的批处理,一切正常,这意味着我的临时表也将填充7500个元素。如果我将批量大小减小到2(例如),并非所有文章都将发送到我的临时数据库。我通常会收到相同数量的文章,例如7495而不是7500。

作为ORM,我正在使用Fluent NHibernate。

你们之前曾经历过这样的经历吗?我不知道为什么会这样。

0 个答案:

没有答案