多行插入Azure移动服务脱机,与后端同步

时间:2015-08-22 18:20:16

标签: c# azure-mobile-services

是否可以修改Azure移动服务.Net后端中的表控制器以处理每个http请求的多插入? 重新上线后,我的应用需要2分钟才能同步其数据。超过70%的2分钟浪费在网络握手开销上。

1 个答案:

答案 0 :(得分:0)

我必须做类似的事情。每次用户创建新项目时,我的应用程序都会创建大约10,000个新行,因此我在移动服务中创建了一个自定义控制器来接受此操作。插入10,000个实体后,我将它们全部拉回到本地同步数据库。

我首先创建了一个自定义控制器。

public class BatchInsertController : ApiController
{
    DbContext context;

    protected override void Initialize(HttpControllerContext controllerContext)
    {
        base.Initialize(controllerContext);
        this.context = new DbContext();
    }

    [HttpPost]
    public async Task<bool> BatchInsert(List<Entity> entities)
    {
        try
        {
            this.context.Entities.AddRange(entities);
            await this.context.SaveChangesAsync();

            return true;
        }
        catch (System.Exception ex)
        {
            Trace.WriteLine("Error: " + ex);
            return false;
        }
    }

}

然后我会从我的客户端代码中调用这个自定义控制器方法。

var entities = new List<Entity>();
// Add a bunch of entities to the list...

foreach (List<Entity> chunkedEntities in entities.ChunksOf(1000))
{
    var response = await _client.InvokeApiAsync<List<Entity>, bool>("batchinsert", chunkedEntities);
}

我一次会有超过10,000条记录,所以我创建了一个扩展方法来分块列表并一次发送1,000条记录。

public static IEnumerable<IList<T>> ChunksOf<T>(this IEnumerable<T> sequence, int size)
{
    List<T> chunk = new List<T>(size);
    foreach (T element in sequence)
    {
        chunk.Add(element);
        if (chunk.Count == size)
        {
            yield return chunk;
            chunk = new List<T>(size);
        }
    }
    if (chunk.Any())
    {
        yield return chunk;
    }
}

之后我在我的本地数据库上做了一个PullAsync()。阅读完this article.

后,我想出了这个