您现在的位置是:主页 > Web前端技术 > Web前端技术

.NET 6开发TodoList应用怎么实现数据塑形开发技术

IDCBT2022-01-05服务器技术人已围观

简介这篇文章主要介绍“.NET6开发TodoList应用怎么实现数据塑形”,在日常操作中,相信很多人在.NET6开发TodoList应用怎么实现数据塑形问题上存在疑惑,小编查阅了各式资料,整理出简单好用

这篇文章主要介绍“.NET 6开发TodoList应用怎么实现数据塑形”,在日常操作中,相信很多人在.NET 6开发TodoList应用怎么实现数据塑形问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”.NET 6开发TodoList应用怎么实现数据塑形”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

      需求

      在查询的场景中,还有一类需求不是很常见,就是在前端请求中指定返回的字段,所以关于搜索的最后一个主题我们就来演示一下关于数据塑形(Data Shaping)。

      目标

      实现数据塑形搜索请求。

      原理与思路

      对于数据塑形来说,我们需要定义一些接口和泛型类实现来完成通用的功能,然后修改对应的查询请求,实现具体的功能。

      实现定义通用接口和泛型类实现

      IDataShaper.cs

      using System.Dynamic;
      
      namespace TodoList.Application.Common.Interfaces;
      
      public interface IDataShaper<T>
      {
          IEnumerable<ExpandoObject> ShapeData(IEnumerable<T> entities, string fieldString);
          ExpandoObject ShapeData(T entity, string fieldString);
      }

      并实现通用的功能:

      DataShaper.cs

      using System.Dynamic;
      using System.Reflection;
      using TodoList.Application.Common.Interfaces;
      
      namespace TodoList.Application.Common;
      
      public class DataShaper<T> : IDataShaper<T> where T : class
      {
          public PropertyInfo[] Properties { get; set; }
      
          public DataShaper()
          {
              Properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
          }
      
          public IEnumerable<ExpandoObject> ShapeData(IEnumerable<T> entities, string? fieldString)
          {
              var requiredProperties = GetRequiredProperties(fieldString);
      
              return GetData(entities, requiredProperties);
          }
      
          public ExpandoObject ShapeData(T entity, string? fieldString)
          {
              var requiredProperties = GetRequiredProperties(fieldString);
      
              return GetDataForEntity(entity, requiredProperties);
          }
      
          private IEnumerable<PropertyInfo> GetRequiredProperties(string? fieldString)
          {
              var requiredProperties = new List<PropertyInfo>();
      
              if (!string.IsNullOrEmpty(fieldString))
              {
                  var fields = fieldString.Split(',', StringSplitOptions.RemoveEmptyEntries);
                  foreach (var field in fields)
                  {
                      var property = Properties.FirstOrDefault(pi => pi.Name.Equals(field.Trim(), StringComparison.InvariantCultureIgnoreCase));
                      if (property == null)
                      {
                          continue;
                      }
      
                      requiredProperties.Add(property);
                  }
              }
              else
              {
                  requiredProperties = Properties.ToList();
              }
      
              return requiredProperties;
          }
      
          private IEnumerable<ExpandoObject> GetData(IEnumerable<T> entities, IEnumerable<PropertyInfo> requiredProperties)
          {
              return entities.Select(entity => GetDataForEntity(entity, requiredProperties)).ToList();
          }
      
          private ExpandoObject GetDataForEntity(T entity, IEnumerable<PropertyInfo> requiredProperties)
          {
              var shapedObject = new ExpandoObject();
              foreach (var property in requiredProperties)
              {
                  var objectPropertyValue = property.GetValue(entity);
                  shapedObject.TryAdd(property.Name, objectPropertyValue);
              }
      
              return shapedObject;
          }
      }

      标签:

      很赞哦! ()

本栏推荐