正在Azure表存储上应用动态LINQ,但异常值不能为null
我正在尝试使用动态LINQ查询azure表存储的表,以仅获取动态构造谓词中的列子集。我能够成功地生成谓词,但要实现Select(即投影)操作以从Azure表的实体中仅获取所需的属性/列,我面临着困难。为了得到列的子集,我尝试使用动态LINQ库。这里的列不是预定义的,列可以是任何内容,用户可以选择。这些列只是Customer类的属性正在Azure表存储上应用动态LINQ,但异常值不能为null,linq,azure,azure-table-storage,Linq,Azure,Azure Table Storage,我正在尝试使用动态LINQ查询azure表存储的表,以仅获取动态构造谓词中的列子集。我能够成功地生成谓词,但要实现Select(即投影)操作以从Azure表的实体中仅获取所需的属性/列,我面临着困难。为了得到列的子集,我尝试使用动态LINQ库。这里的列不是预定义的,列可以是任何内容,用户可以选择。这些列只是Customer类的属性 Months.AsParallel().ForAll(x => RowKeys.AsParallel().WithDegreeOfParallelism(5).
Months.AsParallel().ForAll(x => RowKeys.AsParallel().WithDegreeOfParallelism(5).ForAll(y =>
{
string StartRowKey = y.GetRowKeyStartFilter();
string EndRowKey = y.GetRowKeyEndFilter();
DataContextExciseCustVen rptContextParallel = new DataContextExciseCustVen();
var strPredicate = GetPredicate(x.ToString(), StartRowKey, EndRowKey);
IQueryable<dynamic> query = (rptContextParallel.CreateQuery<DomainData.Entities.Excise.Invoice>(DomainData.Entities.Excise.Invoice.TABLE_NAME)
.Where(strPredicate)
.Select("new (PartitionKey ,RowKey ,Timestamp ,CompanyCode,ProgramCode)")) as IQueryable<dynamic>;
CloudTableQuery<dynamic> dyn = query.AsTableServiceQuery();
foreach (var z in dyn.Execute())
{
threadSafeData.Add(z);
}
}
));
Months.AsParallel().ForAll(x=>RowKeys.AsParallel().WithDegreeOfParallelism(5).ForAll(y=>
{
字符串StartRowKey=y.GetRowKeyStartFilter();
字符串EndRowKey=y.GetRowKeyEndFilter();
DataContextExciseCustVen rptContextParallel=新DataContextExciseCustVen();
var strPredicate=GetPredicate(x.ToString(),StartRowKey,EndRowKey);
IQueryable查询=(rptContextParallel.CreateQuery(DomainData.Entities.Exchange.Invoice.TABLE_NAME)
.Where(strPredicate)
。选择(“新建(分区键、行键、时间戳、公司代码、程序代码)”)作为IQueryable;
CloudTableQuery dyn=query.AsTableServiceQuery();
foreach(dyn.Execute()中的变量z)
{
threadSafeData.Add(z);
}
}
));
当我执行上述代码时,在query.AsTableServiceQuery();,处出现异常;,值不能为null。
Select(“new(Col1,Col2)”是返回IQueryable类型,但不是IQueryable。因为我正在从Azure表返回列的子集,所以我不知道对象的目标类型。每次都是匿名的。IQueryable不包含AsTableServiceQuery()扩展方法。但是IQueryable有来自Azure客户端SDK的此扩展方法
IQueryable<dynamic> query = (rptContextParallel.CreateQuery<Customer>(DomainData.Entities.Customer.TABLE_NAME)
.Where(strPredicate)
.Select("new (CompanyCode,ProgramCode,CustomerName,...)")) as IQueryable<dynamic>;
IQueryable查询=(rptContextParallel.CreateQuery(DomainData.Entities.Customer.TABLE_NAME)
.Where(strPredicate)
。选择(“新建(公司代码、程序代码、客户名称等)”)作为IQueryable;
上面的语句Select子句返回IQueryable类型,并且它被类型转换为IQueryable,因为IQueryable不包含一个TableServiceQuery扩展方法。所以我把cased打到IQueryable。CloudTableQuery dyn=query.AsTableServiceQuery()。。在这里,它抛出一个异常,其值不能为null。看起来类型转换失败。因此无法计算linq表达式。使用ASTableServiceQuery扩展方法实现IQueryable的任何变通方法
我试过另一种方法,我把这句话注释掉了
//CloudTableQuery dyn=query.AsTableServiceQuery();
改变了如下的循环,效果很好。
foreach(查询中的变量z)
{}
但问题是,我没有使用存储客户端的任何AsTableServiceQuery()和execute方法。不调用AsTableServiceQuery会有任何副作用。我将能够接收所有带有ContinuationToken或密钥等的数据。从azure表返回的结果将大约为100万或更多。因此,上面的查询可以检索所有记录以及其他键
请在这方面帮助我…你能用
.AsQueryable()
代替作为IQueryable
吗?不,它不工作。。asQuerable()返回不包含AsTableServiceQuery()的IQueryable()