在 OData v4 控制器中,是否可以返回不同的模型Get()
和Get([FromIDataUri] key)
?
我喜欢使用 ViewModel,当使用Get()
我想返回一个方法xxxOverviewViewModel
。当使用Get([FromIDataUri] key)
方法,我想返回一个 xxxViewModel。
这可能吗?如果可能的话,如何实现?
我尝试过退回不同的型号,但总是得到一个406 Acceptable
.
Webapi.config:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.EnableCors();
config.MapODataServiceRoute("ODataRoute", "odata", GetEdmModel());
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Filter().Expand().Select().OrderBy().MaxTop(null).Count();
}
private static IEdmModel GetEdmModel()
{
var builder = new ODataConventionModelBuilder();
builder.EntitySet<ComplaintViewModel>("ComplaintOData");
return builder.GetEdmModel();
}
}
投诉O数据控制器
public class ComplaintODataController : ODataController
{
private readonly QueryProcessor _queryProcessor;
public ComplaintODataController(QueryProcessor queryProcessor)
{
_queryProcessor = queryProcessor;
}
[EnableQuery]
public IQueryable<ComplaintOverviewViewModel> Get()
{
var result = _queryProcessor.Handle(new GetAllComplaintsQuery());
return result;
}
// WHEN CALLING THIS METHOD I GET A 406:
[EnableQuery]
public ComplaintViewModel Get([FromODataUri] int key)
{
var result = _queryProcessor.Handle(new GetComplaintByIdQuery { Id = key });
return result;
}
}
EDIT:
My GetAllComplaintsQuery.Handle
方法如下所示:
public IQueryable<ComplaintOverviewViewModel> Handle(GetAllComplaintsQuery query)
{
// .All is an IQueryable<Complaint>
var result = _unitOfWork.Complaints.All.Select(c => new ComplaintOverviewViewModel
{
ComplaintType = c.ComplaintType.Description,
CreationDate = c.CreationDate,
Customer = c.Customer,
Description = c.Description,
Id = c.Id,
SequenceNumber = c.SequenceNumber,
Creator = c.Creator.Name
});
return result;
}
这是我的ComplaintConfiguration
public class ComplaintConfiguration : EntityTypeConfiguration<Complaint>
{
public ComplaintConfiguration()
{
Property(p => p.SequenceNumber).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
Property(p => p.Description).IsRequired();
}
}