我试图使用动态 LINQ 查询来查询天蓝色表存储的表,以仅获取沿动态构造谓词的列的子集。我能够成功生成谓词,但是要实现 Select ie Projection Operation 以仅从 Azure 表的实体中获取所需的属性/列,我遇到了困难。为了获得列的子集,我正在尝试使用动态 LINQ 库。这里的列没有预定义,列可以是任何东西,用户可以选择。这些列只不过是客户类的属性..
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(); 处遇到异常,值不能为 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>;
上面的语句,Select Clause 返回 IQueryable 类型并且它被类型转换为 IQueryable 因为 IQueryable 不包含 AsTableServiceQuery 扩展方法。所以我输入 cased 到 IQueryable 。CloudTableQuery dyn = query.AsTableServiceQuery(); ..这里它抛出一个异常,其值不能为空。看起来类型转换失败了。因为无法评估 linq 表达式。使用 ASTableServiceQuery 扩展方法使 IQueryable 变通的任何解决方法。
我尝试了其他方法,我注释掉了这个语句 // CloudTableQuery dyn = query.AsTableServiceQuery(); 并像下面一样更改了 for 循环,这就像魅力一样。
foreach (var z in query)
{}
但问题是,我没有使用任何 AsTableServiceQuery() 和 Storage Client 的执行方法。不调用 AsTableServiceQuery 会有什么副作用吗?我是否能够使用 ContinuationTokens 或 Keys 等接收所有数据?从 azure 表返回的结果将约为 100 万或更多。因此,上面的查询可以检索所有记录以及其他键。
请帮我解决这个...