我试图使用动态LINQ查询查询azure表存储的表,以获得动态构造谓词中的列的子集 . 我能够成功生成谓词,但实现选择即投影操作只从Azure表的实体中获取所需的属性/列我遇到了困难 . 要获取列的子集,我正在尝试使用动态LINQ库 . 这里的列不是预定义的,列可以是任何内容,用户可以选择 . 这些列只是Customer类的属性..
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);
}
}
));
当我执行上面的代码时,我在query.AsTableServiceQuery();上得到异常,Value不能为null . 选择(“new(Col1,Col2)”)返回IQueryable类型,但不返回IQueryable . 因为我从Azure表返回子列集,所以我不知道对象的目标类型 . 它每次都会匿名 . IQueryable不包含AsTableServiceQuery()扩展方法 . 但IQueryable有Azure Client SDK的这种扩展方法 .
IQueryable<dynamic> query = (rptContextParallel.CreateQuery<Customer>(DomainData.Entities.Customer.TABLE_NAME)
.Where(strPredicate)
.Select("new (CompanyCode,ProgramCode,CustomerName,...)")) as IQueryable<dynamic>;
上面的语句,Select Clause返回IQueryable类型,它是类型转换为IQueryable,因为IQueryable不包含AsTableServiceQuery扩展方法 . 所以我输入了IQueryable . CloudTableQuery dyn = query.AsTableServiceQuery(); ..这里抛出一个异常值,不能为null . 看起来类型转换失败了 . 因为无法评估linq表达式 . 任何使用ASTableServiceQuery扩展方法获得IQueryable的工作 .
我尝试了其他方式,我注释掉了这个声明// CloudTableQuery dyn = query.AsTableServiceQuery();并改变为下面的循环,这就像魅力 . foreach (var z in query) {}
但问题是,我没有使用任何AsTableServiceQuery()和Storage Client的执行方法 . 不调用AsTableServiceQuery会有任何副作用吗?我能用ContinuationTokens或Keys等接收所有数据,从azure表返回的结果大约是100万或更多 . 因此,上面的查询可以检索所有记录以及其他键 .
请帮帮我...