#c# #asp.net-core #odata #asp.net-core-3.1
#c# #asp.net-core #odata #asp.net-core-3.1
Вопрос:
В названии в основном говорится о моем вопросе, скажем, у меня есть такие классы
public class ContrivedComplexClass
{
public string stringy { get; set; }
public ContrivedEntityClass ContrivedEntityClass { get; set; }
}
public class ContrivedEntityClass
{
public Guid Id { get; set; }
public int inty { get; set; }
}
мое действие контроллера выглядит так
[HttpGet]
[ODataRoute("GetContrivedComplexClass()")]
public async virtual Task<ContrivedComplexClass> GetContrivedComplexClass()
{
await Task.Delay(10);
ContrivedComplexClass contrivedComplexClass = new ContrivedComplexClass() { stringy = "asdf", ContrivedEntityClass = new ContrivedEntityClass() { Id = Guid.NewGuid(), inty = 3 } };
return contrivedComplexClass;
}
и моя модель edm настроена следующим образом
var builder = new ODataConventionModelBuilder(serviceProvider);
builder.EntitySet<ContrivedEntityClass>("ContrivedEntityClass").EntityType.HasKey(f => f.Id);
builder.Function("GetContrivedComplexClass").Returns<ContrivedComplexClass>();
когда я вызываю функцию из браузера или postman или что-то еще с URL-адресом
https://localhost:5001/odata/GetContrivedComplexClass()?Expand=ContrivedEntityClass
он возвращает только свойства сложного типа, такие как
{"@odata.context":"https://localhost:5001/odata/$metadata#WebPortal.ContrivedComplexClass","stringy":"asdf"}
У кого-нибудь есть идеи, как я должен запрашивать или настраивать это?
Ответ №1:
Настройте свою модель EDM следующим образом:
private static IEdmModel GetEdmModel()
{
var builder = new ODataConventionModelBuilder();
builder.EntitySet<ContrivedEntityClass>("ContrivedEntityClass").EntityType.HasKey(f => f.Id); ;
var function = builder.Function("GetContrivedComplexClass");
function.ReturnsFromEntitySet<ContrivedComplexClass>("GetContrivedComplexClass");
return builder.GetEdmModel();
}
Добавьте ключ в надуманный ComplexClass:
public class ContrivedComplexClass
{
[Key]
public int Id { get; set; }
public string stringy { get; set; }
public ContrivedEntityClass ContrivedEntityClass { get; set; }
}
public class ContrivedEntityClass
{
public Guid Id { get; set; }
public int inty { get; set; }
}
С URL-адресом:
https://localhost:5001/odata/GetContrivedComplexClass()?$Expand=ContrivedEntityClass
Контроллер:
[HttpGet]
[ODataRoute("GetContrivedComplexClass()")]
public async virtual Task<ContrivedComplexClass> GetContrivedComplexClass()
{
await Task.Delay(3);
ContrivedComplexClass contrivedComplexClass = new ContrivedComplexClass
{
Id = 1,
stringy = "asdf",
ContrivedEntityClass = new ContrivedEntityClass()
{
Id = Guid.NewGuid(),
inty = 3
}
};
return contrivedComplexClass;
}
Результат:
Комментарии:
1. Спасибо! Я думал о попытке добавить идентификатор к сложному типу, но не подумал бы о возврате из части сбора.