Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 处理Azure表批量更新的可靠而高效的方法_Linq_Azure_Ienumerable_Azure Storage - Fatal编程技术网

Linq 处理Azure表批量更新的可靠而高效的方法

Linq 处理Azure表批量更新的可靠而高效的方法,linq,azure,ienumerable,azure-storage,Linq,Azure,Ienumerable,Azure Storage,我有一个IEnumerable,我想以最有效的方式将其添加到Azure表中。由于每次批写入都必须定向到同一分区键,每次写入限制为100行 是否有人想尝试以TODO部分中提到的“正确”方式实现此功能?我不知道MSFT为什么没有在这里完成任务 此外,我不确定错误处理是否会使这一点复杂化,也不确定正确的实现方法。以下是Microsoft模式和实践团队针对Microsoft Azure的代码 public void Add(IEnumerable objs) { //todo:优化:采用IEnumera

我有一个
IEnumerable
,我想以最有效的方式将其添加到Azure表中。由于每次批写入都必须定向到同一分区键,每次写入限制为100行

是否有人想尝试以TODO部分中提到的“正确”方式实现此功能?我不知道MSFT为什么没有在这里完成任务

此外,我不确定错误处理是否会使这一点复杂化,也不确定正确的实现方法。以下是Microsoft模式和实践团队针对Microsoft Azure的代码

public void Add(IEnumerable objs)
{
//todo:优化:采用IEnumerable参数的Add方法在使用SaveChangesOptions.batch选项调用SaveChanges方法之前,应检查批处理中的项目数和负载大小。有关批处理和Windows Azure表存储的更多信息,请参阅“aExpense中的事务”一节在《Windows Azure体系结构指南》第1部分:将应用程序移动到云端》一书的第5章“第2阶段:自动化部署和使用Windows Azure存储”,可在http://msdn.microsoft.com/en-us/library/ff728592.aspx.
TableServiceContext上下文=this.CreateContext();
foreach(objs中的var obj)
{
context.AddObject(this.tableName,obj);
}
var saveChangesOptions=saveChangesOptions.None;
if(objs.Distinct(new PartitionKeyComparer()).Count()==1)
{
saveChangesOptions=saveChangesOptions.Batch;
}
context.SaveChanges(saveChangesOptions);
}
私有类PartitionKeyComparer:IEqualityComparer
{
public bool Equals(表服务实体x、表服务实体y)
{
返回string.Compare(x.PartitionKey,y.PartitionKey,true,System.Globalization.CultureInfo.InvariantCulture)==0;
}
public int GetHashCode(表服务实体obj)
{
返回obj.PartitionKey.GetHashCode();
}
}
好吧,我们(模式与实践团队)只是为了展示我们认为有用的其他东西而进行了优化。上面的代码不是真正的“通用库”,而是使用它的示例的特定方法

那一刻,我们认为增加额外的错误处理不会增加太多,我们决定保持简单,但是……我们可能错了

无论如何,如果您遵循//TODO:中的链接,您将发现我们之前编写的指南中的另一部分,该部分对“复杂”存储事务中的错误处理进行了详细介绍(不是“ACID”形式,尽管Windows Azure存储中不支持“ala DTC”事务)

链接如下:

此处更详细地列出了这些限制:

  • 批处理中只应存在实体的一个实例
  • 最多100个实体或4 MB有效负载
  • 相同的分区键(在代码中处理:注意,只有在有单个分区键时才指定“batch”)
  • 等等
添加一些额外的错误处理不会使事情过于复杂,但这取决于您在此基础上构建的应用程序的类型,以及您在应用程序堆栈中处理此问题的偏好。在我们的示例中,应用程序无论如何都不会期望超过100个实体,因此如果出现这种情况,它只会将异常冒泡出来(因为它应该是真正的异常)。总尺寸相同。应用程序中实现的用例使得同一个集合中不可能有相同的实体,所以同样,这种情况永远不会发生(如果发生,它只会抛出)

此处记录了所有“实体集团交易”限制:


让我们知道进展如何!我还想知道本指南的其他部分是否对您有用。

我正在寻找一种通用方法,其中包括数据访问、异常管理和重试的最佳实践。一开始,我被所有的单元测试和统一的东西压得喘不过气来,但我正在慢慢地涉过这一切。我仍在弄清楚“商店”是否与NerdDinner的xyxContext相似,以及如何以一致的方式正确构造我的应用程序。我非常喜欢您对表、blob和队列的“泛型”方法,以及联合特性。有很多东西需要我去学习和理解。好吧,撇开pnp不谈个人幸福;我不仅仅是在寻找有关Azure表限制的评论。我想要一个完全实现的
Table.Save()
方法,该方法将采用具有不同分区键的实体,将它们以100个为一组,并在注释中提到所有约束(例如大小限制)。当然我自己也能做到,但我认为这是一个应该由MSFT拥有、分发和支持的代码示例。理解所有优点。关于“一开始我被所有的单元测试和统一的东西压得喘不过气来”,您认为我们可以如何改进这一点?我们面临的挑战是在“不真实”的同时构建“现实”的东西,如果它有意义的话。。。我们有没有其他方法来呈现内容,以便更容易理解?再次感谢!!我完全自学成才,这就像从消防水龙带里喝水一样令人沮丧、有趣且非常相关(AFAIK)。我会让你们(和StackOverflow)告诉我什么是现实的,什么是不真实的。我想我需要加强我的单元测试技能<代码>如何让它更容易消化?我认为只有真正聪明的人才知道声明、MVC、单元测试、Azure以及在打开第1页之前使用的所有模式。我认为“Hello World”侧边栏或复习会很好。另外,NerdDinner的命名和布局存在一些差异,这让我感到困惑。
    public void Add(IEnumerable<T> objs)
    {
        // todo: Optimize: The Add method that takes an IEnumerable parameter should check the number of items in the batch and the size of the payload before calling the SaveChanges method with the SaveChangesOptions.Batch option. For more information about batches and Windows Azure table storage, see the section, "Transactions in aExpense," in Chapter 5, "Phase 2: Automating Deployment and Using Windows Azure Storage," of the book, Windows Azure Architecture Guide, Part 1: Moving Applications to the Cloud, available at http://msdn.microsoft.com/en-us/library/ff728592.aspx.

        TableServiceContext context = this.CreateContext();

        foreach (var obj in objs)
        {
            context.AddObject(this.tableName, obj);
        }

        var saveChangesOptions = SaveChangesOptions.None;
        if (objs.Distinct(new PartitionKeyComparer()).Count() == 1)
        {
            saveChangesOptions = SaveChangesOptions.Batch;
        }

        context.SaveChanges(saveChangesOptions);
    }


   private class PartitionKeyComparer : IEqualityComparer<TableServiceEntity>
    {
        public bool Equals(TableServiceEntity x, TableServiceEntity y)
        {
            return string.Compare(x.PartitionKey, y.PartitionKey, true, System.Globalization.CultureInfo.InvariantCulture) == 0;
        }

        public int GetHashCode(TableServiceEntity obj)
        {
            return obj.PartitionKey.GetHashCode();
        }
    }