ASP.NET Web APIにおけるURIによるエンティティの一部のフィールドの表示

3941 ワード


エンティティ内のすべてのフィールドを表示したくない場合があります.例えば、クライアントはlocaohost:43321/api/groups/1/items?fields=idlocaohost: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インタフェースを実現し、反射によりフィールドをExpandObjectのkey、フィールド値をExpandObjectのvalueとする.