来自IronPython的Azure表存储查询

时间:2013-07-15 15:41:53

标签: c# azure ironpython azure-table-storage

我有一个项目使用IronPython作为脚本引擎来执行各种任务。其中一个任务需要在Azure Table存储上进行一些表查找,但表格布局不同,并且会经常更改,所以我需要在Python中定义模型类。

以下是我遇到的问题,每当我运行查询时,它都会抱怨客户端库不支持我项目中的基类。

Unhandled Exception: System.InvalidOperationException: The type 'IronPython.NewTypes.IPTest.BaseModelClass_1$1' is not supported by the client library.

Python代码:

import clr
import System
clr.AddReference("System.Core")
clr.ImportExtensions(System.Linq)


class MyTable(AzureTableService.BaseModelClass):
    def __new__(self, partitionKey, rowKey):
        self.PartitionKey = partitionKey
        self.RowKey = rowKey
        return super.__new__(self)

    MyTableDetails = "";

#I can manually create an entity, and it recognizes the base class, but not when I try to return from a query
#working = MyTable("10", "10040")
#print working.PartitionKey

y = AzureTableService.GetAzureTableQuery[MyTable]("MyTable")
z = y.Where(lambda c: c.PartitionKey == "10" and c.RowKey == "10040")

print(z.Single())

C#代码:

public class AzureTableService {
    private CloudStorageAccount mStorageAccount;
    public AzureTableService() {
        CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) => {
            var connectionString = ConfigurationManager.AppSettings[configName];
            configSetter(connectionString);
        });
        mStorageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");        
    }

    private TableServiceContext AzureTableServiceContext {
        get {
            var context = mStorageAccount.CreateCloudTableClient().GetDataServiceContext();
            context.IgnoreResourceNotFoundException = true;
            return context;
        }
    }
    public IQueryable<T> GetAzureTableQuery<T>(string TableName) {
        return AzureTableServiceContext.CreateQuery<T>(TableName);
    }

    public class BaseModelClass : TableServiceEntity {
        public BaseModelClass(string partitionKey, string rowKey) : base(partitionKey, rowKey) { }
        public BaseModelClass() : base(Guid.NewGuid().ToString(), String.Empty) { }
    }
}

我有什么明显的遗失吗?在我的注释代码中,它似乎在我手动创建它时识别我的基类属性,但是当我尝试从查询中返回它时它不会。

1 个答案:

答案 0 :(得分:0)

您遇到的问题与System.Data.Services.Client使用的Microsoft.WindowsAzure.StorageClient有关。

它限制了可以在数据服务客户端中使用的类型。这似乎阻止了在查询结果的反序列化过程中使用IDynamicMetaObjectProvider(基本上任何动态对象,因此也就是IronPython类的任何对象)的任何实现。

我使用Azure Storage 1.7.0.0,2.0.6.0和2.1.0.0-rc测试了该方案,确认了您的结果。

您可以随时查看the source,看看是否可以使用AtomPub的其他反序列化程序。