我正在使用 Microsoft OData 客户端(不生成代码)来访问 Dynamics CRM API,并且我试图弄清楚如何让它生成像这样的简单 URL...
https://<base URL>/EntityDefinitions(<ObjId>)/Attributes/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$expand=GlobalOptionSet
这是一个简单的查询,用于从单个实体获取导航属性,向下转换AttributeMetadata
fromAttributes
到PicklistAttributeMetadata
,然后在其中展开属性。
使用Simple.OData.Client
,我可以使用以下代码执行此操作:
client.For<EntityDefinition>()
.Key(objId)
.NavigateTo(ed => ed.Attributes)
.As<PicklistAttributeMetadata>()
.Expand(md => md.OptionSet);
与Microsoft.OData.Client
,我有一点战斗。到目前为止,我能想到的最好的是:
var plq = context.CreateQuery<EntityDefinition>("EntityDefinitions")
.Where(ed => ed.MetadataId == objId)
.AsDataServiceQuery(); // An ext method to cast back to DataServiceQuery<>;
// plq looks like https://<base URL>/EntityDefinitions(<ObjId>)
// but I can't figure out how to add /Attributes to the end without doing this:
var plq2 = context.CreateQuery<Attribute>(plq.GetPath("Attributes"), true);
// That works, but trying to cast to PicklistAttributeMetadata doesn't do anything
var plq3 = plq2.Cast<PicklistAttributeMetadata>().AsDataServiceQuery().Expand(md => md.OptionSet);
但是,上面的代码给了我这个 URL:
https://<base URL>/EntityDefinitions(<ObjId>)/Attributes?$expand=OptionSet
也就是说,我已经设法让导航工作(尽管通过讨厌的、非类型安全的代码),但向下转换根本没有任何效果。我也试过IQueryable.OfType<>
,但没有任何区别。
与 Microsoft OData 库中的 Simple.OData.Client 库.As<>
等效的正确方法是什么?.Navigate()
我现在真的更喜欢 Simple.OData.Client,但我想给 MS OData 一个公平的机会,因为它有更多的下载量,而且它是一个 MS 包,所以可能有更长的使用寿命。
谢谢!