我想添加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之类的对象-对象映射器完成.