Web API 2 Odata 4 参数问题

Web API 2 Odata 4 Parameter Issue

我在为 odata4 定义函数时遇到问题。默认的 get 可以工作,但我想需要一个用户参数,以便可以确定客户端集,涉及其他 table,因此需要 LINQ,我还 return 一个 DTO 而不是默认的 table 信息 (EF)。下面是代码。我收到 "Invalid EntitySetPath detected. 'bindingParameter/Client' is not a valid entity set path for procedure 'Default.GetClients'." 我做错了什么?

WebApiConfig

 public static void Register(HttpConfiguration config)
    {
        ODataModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<client>("Client").EntityType.HasKey(p =>       p.int_id);

        var function = builder.Function("GetClients");
        function.Parameter<string>("user");
        function.ReturnsCollectionFromEntitySet<client>("Client");

        builder.EntitySet<ClientDTO>("ClientDTO");

        config.MapODataServiceRoute(
            routeName: "ODataRoute",
            routePrefix: null,
            model: builder.GetEdmModel());

WebApp.Controller

 [ODataRoute("GetClients(user={user})")]
    [EnableQuery(PageSize=25)]
    public IQueryable<ClientDTO> GetClients([FromODataUri] string user)
    {
         var clients = (from c in db.clients
                       join ...

如果您的 OData 控制器正在 returning DTO,函数应如下所示:

    var function = builder.Function("GetClients");
    function.Parameter<string>("user");
    function.ReturnsCollectionFromEntitySet<ClientDTO>("Client");

根据您当前的设置,GetClients 的 OData 路由表示它正在 returning 一个 ClientDTO 对象,但是您的 WebApiConfig 表明您正在 returning 一个 [=12] =]对象。

因为实体集合被 returned 实际上是 DTO。显示 ("Client") 的部分只是 OData 服务如何将对象的名称报告给使用 OData 服务的项目。为了我个人的理智,我通常也会包括 DTO,这样我就知道什么时候使用 DTO 以及什么时候使用直接实体。所以在我自己的设置中,我会 return ("ClientDTO"),这只是个人喜好。