C# 在对OData使用LINQ提供程序时,是否可以只返回嵌套实体的特定属性?(相当于$expand和$select)

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

我使用的是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("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部件来做吗?”。