Asp.net Web API 2 学习随手记 (Expression)
来源:互联网 发布:python 网络拓扑图 编辑:程序博客网 时间:2024/06/05 20:17
Asp.net Web API 2 学习随手记 (Expression)
在使用 Asp Web API2 Controller with actions, using Entity Framework 时,遇到了一个问题,怎样才能客制化返回的值(因为自动生成的 controller 会返回 model 里所有的属性)。
比如说:
VS 为我生成的 workstations model 包含了
- workStationID(工作台ID),
- compID(公司ID),
- BPID(分部场所ID),
- descriptionLN(中文描述),
- descriptionEN(英文描述)
基本属性,以及其他 model 的 ICollection
- MEST_SSCCAssignment
- MEST_SSCCLabelPrintLog
直接 GET api/workstations 会返回想看及不想看的所有数据。实际此时我想看到的只有 workstationID 及 descriptionLN 这两个属性。
[{ "$id":"1","MEST_SSCCAssignment":[], "MEST_SSCCLabelPrintLog":[], "workStationID":1, "compID":"00100", "BPID":"10010", "descriptionLN":"3楼码板区,4号楼 (A/E线)", "descriptionEN":"3/F Pallet Packing Area, #4 Building (Line A/E)" },{ "$id":"2","MEST_SSCCAssignment":[], "MEST_SSCCLabelPrintLog":[], "workStationID":2, "compID":"00100", "BPID":"10010","descriptionLN":"2楼码板区,4号楼 (A/E线)", "descriptionEN":"2/F Pallet Packing Area, #4 Building (Line B/F/G)"}]
在网上搜了一下,似乎没有类似的需要,要不然就是这个问题太简单,不值得去记录。Anyway,反正是没找到。现在你知道了,这个博客主要是我自己学习的记录(再好的记忆都不如一只最便宜的笔和纸)。
于是,我用了一个最土炮的方法,写了一个类,然后用 foreach 遍历并用 List 存储起来,最后用 IHttpActionResult 返回 List
private class tupaoWorkstation{ public int workstationId; public string descLn;}// GET: api/Workstationspublic IHttpActionResult GetMESM_WorkStation(){ List<tupaoWorkstation> _ws = new List<tupaoWorkstation>(); foreach (MESM_WorkStation ws in db.MESM_WorkStation) { tupaoWorkstation temp = new tupaoWorkstation { workstationId = ws.workStationID, descLn = ws.descriptionLN }; _ws.Add(temp); } if (_ws.Count == 0) { return NotFound(); } return Ok(_ws);}
这样,返回的值就干净多了有木有
[{ "$id":"1", "workstationId":1, "descLn":"3楼码板区,4号楼 (A/E线)" },{ "$id":"2", "workstationId":2, "descLn":"2楼码板区,4号楼 (A/E线)"}]
再再再后来,在 http://www.asp.net/web-api/overview/web-api-routing-and-actions 上学习怎么使用 Routing 时,突然发现它里面给了更高大上的方式来达到上面的目的!那就是用 Expression!
怎么做呢,其实跟土炮方法差不多(至少对我来说),也是需要先创建一个类来存储最终要提供的信息。统一一个叫法 Dto (Data transfer object)。人家都已经有名字了,我还去傻傻的 Reinvent the wheel 干啥呢?
于是,我就写了一个 WorkstationDto 的类,跟上面的土炮 workstation类的内容一样。然后,重点来了,在 controller 里加上下面这句
private static readonly Expression<Func<MESM_WorkStation, WorkstationDto>> AsWsDto = x => new WorkstationDto{ id = x.workStationID, descLn = x.descriptionLN};
然后 GetMESM_WorkStation() 这个 function 就可以简单的改为
// GET: api/Workstationspublic IQueryable<WorkstationDto> GetMESM_WorkStation(){ return db.MESM_WorkStation.Select(AsWsDto);}
看到没,只要简单在生成的代码后面加上 .Select(AsWsDto) 就可以了(返回的 IQueryable 的 Type 也改为 WorkstationDto)!比起前面用 foreach 来的简洁多了。有木有有木有?
当然,返回的值和土炮方法是一样的。
好了,就这么多。如果你有幸(或不幸)看到这篇文章,并且有意见的话,就留言吧。如果小编有空的话会回复你的。
- Asp.net Web API 2 学习随手记 (Expression)
- asp.net web api
- ASP.NET Web API
- asp.net web api
- asp.net web api
- asp.net web api
- 入门 ASP.NET Web API 2 (C#)
- 《ASP.NET Web API 2框架揭秘》
- ASP.NET Web API 2框架揭秘
- ASP.NET Web API 2 入门教程
- 【翻译整理】ASP.NET Web API 2
- 入门--ASP.NET Web API 2
- ASP.NET MVC Web API 学习笔记----HttpClient简介
- 实战 ASP.NET Web API
- ASP.NET Web Api 教程
- ASP.NET Web API详解
- ASP.NET Web API 简介
- ASP.NET Web API GZip
- redis的高级应用之一(Redis安全性\主从复制\事务处理)
- 优雅地实现RecycleView的点击、拖动、和侧滑删除
- 时间间隔: SystemClock.uptimeMillis与System.currentTimeMillis
- build your own lisp ch7 笔记
- 两个成员的类模板2
- Asp.net Web API 2 学习随手记 (Expression)
- ListView 条目多样式展示
- 查找的有关操作
- win10 64位缺少msvcp60d.dll和msvcrtd.dll文件
- redis 高级应用之二(Redis的持久化 和 消息的[pub/sub]发布和订阅)
- bmp--16种颜色
- 微信在线调试
- PHP函数式编程初探
- Socket原理与编程基础