根据参数从不同的集合加载数据



我正在使用OData Connected Service来消费OData。在我的端点中,有很多集合,所以为了避免意大利面条代码,我想我会使用一个参数来执行我的代码,该参数会告诉使用哪个集合。

这是我为单个集合所做的代码片段:

var ctx = new ODataService(new Uri("http://urlofodataendpoint/OData/"));
ctx.Credentials = System.Net.CredentialCache.DefaultCredentials; 
ctx.Format.UseJson();
var query = from f in ctx.Files
select new File
{
Title = f.Title
};
DataServiceCollection<File> files = new DataServiceCollection<File>(query);
while (files.Continuation != null)
files.Load(ctx.Execute(files.Continuation));

foreach (var f in files)
{
//do something for each File
}

在这种情况下,文件是文件类型的集合。我想为每个集合执行此代码。当然,每个集合都有不同的类型。 这是我尝试过的:

string nameOfCollection = "Files";
var ctx = new ODataService(new Uri("https://urlofodataendpoint/OData/"));
ctx.Credentials = new System.Net.CredentialCache.DefaultCredentials; 
ctx.Format.UseJson();

dynamic type = ctx.Links;
PropertyInfo[] PI = ctx.GetType().GetProperties();
for(int i=0; i<PI.Count();i++)
{
if (PI[i].Name == nameOfCollection )
type = PI[i];
}
Console.WriteLine(type);
//Type itemtype = type.GetType().GetGenericArguments().Single();
var query = from f in ((IEnumerable<Type>)type).Cast<dynamic>()
select f;
DataServiceCollection <dynamic> files = new DataServiceCollection<File>(query);
while (files.Continuation != null)
files.Load(ctx.Execute(files.Continuation));

不幸的是,

var query = from f in ((IEnumerable<Type>)type).Cast<dynamic>()
select f;

部件失败

System.InvalidCastException: '无法强制转换类型的对象 "System.Reflection.RuntimePropertyInfo"键入 'System.Collections.Generic.IEnumerable'1[System.Type]'.">

此外,我想分配数据服务集合的部分也不起作用:

错误 CS1503 参数 1: 无法从 'System.Collections.Generic.IEnumerable' to 'System.Collections.Generic.IEnumerable'

如何动态选择集合并查询它?

当您尝试将变量类型转换为IEnumerable<Type>时,您得到无效的强制转换。

请考虑更改此代码:

var query = from f in ((IEnumerable<Type>)type).Cast<dynamic>()
select f;

自:

var query = from f in ((IEnumerable)type.GetValue(ctx)).Cast<dynamic>()
select f;

最新更新