c#-将OData添加到Web API 2,而无需耦合客户端和服务器

我想添加OData语法来查询应用程序的数据.我不想完全实现ODataController,但是拥有ApiController并实现一个支持OData查询的GET操作,如下所述:Supporting OData Query Options in ASP.NET Web API 2

我想要的示例:

public class LetterEntity
    {
        public int Id {get; set;}

        public string Title {get; set;}

        public string Content {get; set;}

        public string Source {get; set;}

        public DateTime SendingTime {get; set;} 

        public string AnotherWierdString {get; set;
        ...
    }

    public class LetterDTO
    {
        public int Id {get; set;}

        public string Title {get; set;}

        public string LetterContent {get; set;}

        public string Source {get; set;}

        public DateTime SendingTime {get; set;} 
    }

    public class LetterInsideFolderDTO 
    {
        public string Title {get; set;}

        public string Source {get; set;}
    }


public class LettersController : ApiController
{           
    // Is there a way to do something like the following?:  
    [HttpGet]
    [Route("api/letters")]
    [EnableQuery]
    public IQueryable<LetterInsideFolderDTO> Get(ODataQueryOptions<LetterDTO> query) 
    { 
        IQueryable<Letter> letters = db.Letters;

        var queryOnEntites = // Convert the query to work on the entities somehow? - This is where I need help!!

        var afterQuery = query.ApplyTo(letters)

        IQueryable<LetterInsideFolderDTO> dtos = afterQuery.ProjectTo<LetterInsideFolderDTO>(afterQuery)

        return dtos;
    }
}

由于目前我直接在客户端查询中使用实体模型,因此客户端与服务器之间存在很强的耦合.
例如,如果我要查询并获取“内容”字段中所有具有“ abc”的字母,则需要路由到以下内容:

api/letters/?$filter=contains(Content,'abc')

如果明天我决定将该属性从“ Content”更改为“ LetterContent”,则所有客户端代码都将被破坏.

我该如何超越?

解决方法:

与其直接公开您的实体模型,不如创建与每个实体模型相对应的ViewModel.它们不过是简单的类,它们具有相同或仅需要的属性,我们希望将它们公开给外界.以这种方式实现后,您的实体模型属性可能会更改,但ViewModels可以保持不变.您还将解决安全方面的问题,即不要将实体的每个属性都暴露给最终客户.

实体模型和ViewModel之间的映射必须由您自己或由诸如AutoMapper之类的对象-对象映射器完成.

上一篇:C#-具有多个键的OData


下一篇:使用nodejs调用C4C的Odata服务创建销售订单