Asp.net Web API 2 学习随手记 (Expression)

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/Workstations
public 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/Workstations
public IQueryable<WorkstationDto> GetMESM_WorkStation()
{
    return db.MESM_WorkStation.Select(AsWsDto);
}

看到没,只要简单在生成的代码后面加上 .Select(AsWsDto) 就可以了(返回的 IQueryable 的 Type 也改为 WorkstationDto)!比起前面用 foreach 来的简洁多了。有木有有木有?

当然,返回的值和土炮方法是一样的。

好了,就这么多。如果你有幸(或不幸)看到这篇文章,并且有意见的话,就留言吧。如果小编有空的话会回复你的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值