zoukankan      html  css  js  c++  java
  • ASP.NET Web API中通过URI显示实体中的部分字段

    有时候我们可能不想显示某个实体中的所有字段。比如客户端发出如下请求:

    locaohost:43321/api/groups/1/items?fields=id
    locaohost:43321/api/groups/1/items?fields=id,name

    以上,对于Item这个类,我们可能只想显示id,也有可能是想显示id和name,等等。

    如何实现呢?

    → 后端接受fields这个查询字符串的值,split到数组或集合中
    → 遍历这些字段,使用反射获取字段的值,并把每个键值存储起来

    假设有如下的领域:

    public class Group
    {
        public int Id{get;set;}
        public int UserId{get;set;}
        public string Title{get;set;}
        public string Descritpion{get;set;}
        public int StatusId{get;set;}
        public ICollection<Item> Items{get;set;}
    }
    
    public class Item
    {
        public int Id{get;set;}
        public string Name{get;set;}
    }

    针对Item的控制器如下:

    public class ItemsController : ApiController
    {
        [Route("groups/{groupId}/items", Name="ItemsForGroup")]
        public  IHttpActionResult Get(int groupId, string fields = null)
        {
            List<string> lstOfFields = new List<string>();
            
            if(fields != null)
            {
                lstOfFields = fields.ToLower().Split('').ToList();
            }
            
            var result = _repo.GetItems()
                .ToList()
                .Select(e => ItemFactory.CreateDataShapedObject(e, lstOfFields));
            
            return Ok(result);
        }
    }
    
    
    public staic class ItemFactory
    {
        public object CreateDataShapedObject(Item item, List<string> lstOfFields)
        {
            if(!lstOfFields.Any())
            {
                return item;
            }
            else
            {
                //运行时对象
                ExpandObject objectToReturn = new ExpandObject();
                foreach(var field in lstOfFields)
                {
                    //获取字段值
                    var fieldValue = item.GetType()
                        .GetProperty(field, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance)
                        .GetValue(item, null);
                        
                    ((IDictionary<string, object>)objectToReturn).Add(field, fieldValue);
                }
                return objectToReturn;
            }
        }
    }

    以上,ExpandObject是运行时对象,实现IDictionary<string, object>接口,通过反射,把字段作为ExpandObject的key,把字段值作为ExpandObject的value。

  • 相关阅读:
    Unity制作地形的常用插件之GAIA
    JetBrains套装免费学生授权申请(IntelliJ, ReSharper, WebStorm...)
    Unity2D游戏开发之保卫萝卜
    Unity制作出《超级马里奥》的2D和3D混合效果
    Unity2019.1中文技术手册离线版
    暗黑战神! Unity3D网游ARPG实战案例
    Unity移动端入门
    win10如何查看电脑端口使用情况
    自制FastDFS文件服务器虚拟机分享
    MySQL:使用SQL语句删除所有索引
  • 原文地址:https://www.cnblogs.com/darrenji/p/5150215.html
Copyright © 2011-2022 走看看