OData v4コントローラでは、Get()
とGet([FromIDataUri] key)
の異なるモデルを返すことはできますか?ODataControllerで異なるモデルを返すことは可能ですか?
私はViewModelsを使いたいのですが、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();
}
}
ComplaintODataController
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:
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;
}
とTHI:
マイGetAllComplaintsQuery.Handle
方法は、次のようになりますSは両方のモデルのための傘のクラスを作成し、getメソッドは、あなたが望むものをそれぞれ返す必要があり、私のComplaintConfiguration
public class ComplaintConfiguration : EntityTypeConfiguration<Complaint>
{
public ComplaintConfiguration()
{
Property(p => p.SequenceNumber).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
Property(p => p.Description).IsRequired();
}
}
コードを共有できますか? – Marusyk