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