Asp.net web api OData是否支持枚举类型的groupby?

Asp.net web api OData是否支持枚举类型的groupby?,asp.net-web-api,odata,Asp.net Web Api,Odata,OData的版本: <?xml version="1.0" encoding="utf-8"?> <packages> <package id="Microsoft.AspNet.OData" version="5.9.1" targetFramework="net45" /> <package id="Microsoft.OData.Core" version="6.15.0" targetFramework="net45" /> &

OData的版本:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.AspNet.OData" version="5.9.1" targetFramework="net45" />
  <package id="Microsoft.OData.Core" version="6.15.0" targetFramework="net45" />
  <package id="Microsoft.OData.Edm" version="6.15.0" targetFramework="net45" />
  <package id="Microsoft.Spatial" version="6.15.0" targetFramework="net45" />
</packages>
public enum Color
{
    Red = 1,
    Green = 2,
    Blue = 3
}
public class Vehicle
{
    public Guid VehicleId { get; set; }
    [JsonConverter(typeof(StringEnumConverter))]
    public Color? Color { get; set; }
}
[HttpGet]
[Route("vehicles")]
public IHttpActionResult GetVehicles(ODataQueryOptions<Vehicle> options)
{
    var query = dbContext.Vehicle.Select(x => new Vehicle
        {
            VehicleId = x.VehicleId,    // guid type for x.VehicleId
            Color = (Color?)x.ColorId    // nullable int type for x.ColorId
        });

    var odataQuery = options.ApplyTo(query) as IQueryable<object>;

    return Ok(odataQuery.AsEnumerable<Vehicle>());
}
车辆类别:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.AspNet.OData" version="5.9.1" targetFramework="net45" />
  <package id="Microsoft.OData.Core" version="6.15.0" targetFramework="net45" />
  <package id="Microsoft.OData.Edm" version="6.15.0" targetFramework="net45" />
  <package id="Microsoft.Spatial" version="6.15.0" targetFramework="net45" />
</packages>
public enum Color
{
    Red = 1,
    Green = 2,
    Blue = 3
}
public class Vehicle
{
    public Guid VehicleId { get; set; }
    [JsonConverter(typeof(StringEnumConverter))]
    public Color? Color { get; set; }
}
[HttpGet]
[Route("vehicles")]
public IHttpActionResult GetVehicles(ODataQueryOptions<Vehicle> options)
{
    var query = dbContext.Vehicle.Select(x => new Vehicle
        {
            VehicleId = x.VehicleId,    // guid type for x.VehicleId
            Color = (Color?)x.ColorId    // nullable int type for x.ColorId
        });

    var odataQuery = options.ApplyTo(query) as IQueryable<object>;

    return Ok(odataQuery.AsEnumerable<Vehicle>());
}
Web API端点:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.AspNet.OData" version="5.9.1" targetFramework="net45" />
  <package id="Microsoft.OData.Core" version="6.15.0" targetFramework="net45" />
  <package id="Microsoft.OData.Edm" version="6.15.0" targetFramework="net45" />
  <package id="Microsoft.Spatial" version="6.15.0" targetFramework="net45" />
</packages>
public enum Color
{
    Red = 1,
    Green = 2,
    Blue = 3
}
public class Vehicle
{
    public Guid VehicleId { get; set; }
    [JsonConverter(typeof(StringEnumConverter))]
    public Color? Color { get; set; }
}
[HttpGet]
[Route("vehicles")]
public IHttpActionResult GetVehicles(ODataQueryOptions<Vehicle> options)
{
    var query = dbContext.Vehicle.Select(x => new Vehicle
        {
            VehicleId = x.VehicleId,    // guid type for x.VehicleId
            Color = (Color?)x.ColorId    // nullable int type for x.ColorId
        });

    var odataQuery = options.ApplyTo(query) as IQueryable<object>;

    return Ok(odataQuery.AsEnumerable<Vehicle>());
}
[HttpGet]
[路线(“车辆”)]
公共IHttpActionResult获取车辆(ODataQueryOptions选项)
{
var query=dbContext.Vehicle.Select(x=>newvehicle
{
VehicleId=x.VehicleId,//x.VehicleId的guid类型
Color=(Color?)x.ColorId//x.ColorId的可空int类型
});
var odataQuery=options.ApplyTo(查询)为可查询的;
返回Ok(odataQuery.AsEnumerable());
}
场景1:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.AspNet.OData" version="5.9.1" targetFramework="net45" />
  <package id="Microsoft.OData.Core" version="6.15.0" targetFramework="net45" />
  <package id="Microsoft.OData.Edm" version="6.15.0" targetFramework="net45" />
  <package id="Microsoft.Spatial" version="6.15.0" targetFramework="net45" />
</packages>
public enum Color
{
    Red = 1,
    Green = 2,
    Blue = 3
}
public class Vehicle
{
    public Guid VehicleId { get; set; }
    [JsonConverter(typeof(StringEnumConverter))]
    public Color? Color { get; set; }
}
[HttpGet]
[Route("vehicles")]
public IHttpActionResult GetVehicles(ODataQueryOptions<Vehicle> options)
{
    var query = dbContext.Vehicle.Select(x => new Vehicle
        {
            VehicleId = x.VehicleId,    // guid type for x.VehicleId
            Color = (Color?)x.ColorId    // nullable int type for x.ColorId
        });

    var odataQuery = options.ApplyTo(query) as IQueryable<object>;

    return Ok(odataQuery.AsEnumerable<Vehicle>());
}
试试?$apply=groupby((vehicleId)),它就工作了

场景2:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.AspNet.OData" version="5.9.1" targetFramework="net45" />
  <package id="Microsoft.OData.Core" version="6.15.0" targetFramework="net45" />
  <package id="Microsoft.OData.Edm" version="6.15.0" targetFramework="net45" />
  <package id="Microsoft.Spatial" version="6.15.0" targetFramework="net45" />
</packages>
public enum Color
{
    Red = 1,
    Green = 2,
    Blue = 3
}
public class Vehicle
{
    public Guid VehicleId { get; set; }
    [JsonConverter(typeof(StringEnumConverter))]
    public Color? Color { get; set; }
}
[HttpGet]
[Route("vehicles")]
public IHttpActionResult GetVehicles(ODataQueryOptions<Vehicle> options)
{
    var query = dbContext.Vehicle.Select(x => new Vehicle
        {
            VehicleId = x.VehicleId,    // guid type for x.VehicleId
            Color = (Color?)x.ColorId    // nullable int type for x.ColorId
        });

    var odataQuery = options.ApplyTo(query) as IQueryable<object>;

    return Ok(odataQuery.AsEnumerable<Vehicle>());
}

但是使用?$apply=groupby((color)),这将抛出错误消息(“exceptionMessage”:“参数类型不匹配”)。

以下是来自odata.org的答案

从规范的角度来看,枚举类型是基本类型,所以 它们可以在groupby中使用

但是,这并不保证您的首选工具集已经存在 支持这一点


我也有同样的问题,使用ODATA-v4