C# 在对OData使用LINQ提供程序时,是否可以只返回嵌套实体的特定属性?(相当于$expand和$select)
我使用的是Dynamics CRM Online Web API。我可以获取单个帐户实体,如下所示:C# 在对OData使用LINQ提供程序时,是否可以只返回嵌套实体的特定属性?(相当于$expand和$select),c#,entity-framework,linq,.net-4.0,odata,C#,Entity Framework,Linq,.net 4.0,Odata,我使用的是Dynamics CRM Online Web API。我可以获取单个帐户实体,如下所示: var context = new DataServiceContext(new Uri("https://myorg.crm4.dynamics.com/api/data/v8.1/")); // I hook into the BuildingRequest event here to add my auth header token var accountID = new Guid("8d
var context = new DataServiceContext(new Uri("https://myorg.crm4.dynamics.com/api/data/v8.1/"));
// I hook into the BuildingRequest event here to add my auth header token
var accountID = new Guid("8d4e3373-454f-e611-80dc-c4346bad506c");
var account = (from a in context.Accounts
where a.Accountid == accountID
select new Account {
Name = a.Name,
Createdby = a.Createdby
}).Single();
https://myorg.crm4.dynamics.com/api/data/v8.1/accounts(8d4e3373-454f-e611-80dc-c4346bad506c)?$expand=createdby&$select=name
生成的OData查询字符串如下所示:
var context = new DataServiceContext(new Uri("https://myorg.crm4.dynamics.com/api/data/v8.1/"));
// I hook into the BuildingRequest event here to add my auth header token
var accountID = new Guid("8d4e3373-454f-e611-80dc-c4346bad506c");
var account = (from a in context.Accounts
where a.Accountid == accountID
select new Account {
Name = a.Name,
Createdby = a.Createdby
}).Single();
https://myorg.crm4.dynamics.com/api/data/v8.1/accounts(8d4e3373-454f-e611-80dc-c4346bad506c)?$expand=createdby&$select=name
这工作正常,只返回帐户名。我的“问题”是,它还返回整个SystemUser实体及其所有属性,并将它们嵌套在CreatedBy中
{
"@odata.context":"https://myorg.crm4.dynamics.com/api/data/v8.1/$metadata#accounts(name,createdby)/$entity",
"@odata.etag":"W/\"752336\"",
"name":"Test Account 01",
"accountid":"8d4e3373-454f-e611-80dc-c4346bad506c",
"createdby":{
"@odata.etag":"W/\"752039\"",
"ownerid":"11fd590a-6147-e611-80d8-c4346bad62c0",
"_queueid_value":"16fd590a-6147-e611-80d8-c4346bad62c0",
"_createdby_value":null,
... lots of other properties here ...
"address1_stateorprovince":null,
"displayinserviceviews":false,
"timezoneruleversionnumber":null
}
}
我只想返回SystemUser实体的特定属性,该实体将使用如下OData查询(重要部分是$expand=createdby($select=fullname)
):
如果我运行上面的查询,我现在得到的Account实体只有它的名称,对于CreatedBy,它只有SystemUser的Fullname属性
在初始LINQ查询中,我找不到这样做的方法。我尝试了这个,但出现了错误:
var account = (from a in context.Accounts
where a.Accountid == accountID
select new Account {
Name = a.Name,
Createdby = new SystemUser { Fullname = a.Createdby.Fullname }
}).Single();
是否可以只选择嵌套实体的特定属性而不是整个属性?返回整个东西并不是世界末日,我只想返回我想要的数据,如果有帮助的话 2016年8月17日编辑:在进一步排除故障后,似乎创建新的SystemUser并仅填充full name属性确实生成了正确的OData查询字符串。如果我手动运行它,我会得到正确的结果。在OData客户机模型中运行它仍然会出错。错误是: 处理条目时找不到所需的属性“Createdby”。访问此属性之前,请检查是否为null
属性不为null,根据定义不能为空。我认为它可能是在SystemUser实体上寻找CreatedBy,而不是在Account上,但我不确定。对于OData V4,在$expand中添加($select=…)。所以它变成了$expand=createdby($select=propertyA,propertyB)我不是想粗鲁,但是你读过这个问题了吗?这是字面上写在那里的例子。我道歉,我没有充分阅读。我读的是粗体文本,而不是“我可以用linq部件来做吗”。对于ODataV4,在$expand中添加一个($select=…)。所以它变成了$expand=createdby($select=propertyA,propertyB)我不是想粗鲁,但是你读过这个问题了吗?这是字面上写在那里的例子。我道歉,我没有充分阅读。我读的是粗体文本,而不是“我可以用linq部件来做吗?”。