• 数据库查询


    当使用Sql语句查询数据库,返回DataSet数据集。

    DataSet转化为数据列表,可以通过映射方式直接返回Entity数据列表

    新建一个特性类,用于数据库列表列名称映射

    LinqToDB提供了一个ColumnAttribute,但是通过反射不方便获取ColumnAttribute
    获取CustomAttributes时,虽然可以筛选到指定ColumnAttribute,但是CustomAttributeData不容易转换到ColumnAttribute

    var customAttributeDatas = mi.CustomAttributes.Where(i=>i.AttributeType.Name==nameof(ColumnAttribute)).ToList();

    以下是自定义的特性类

     1     [AttributeUsage(AttributeTargets.Property)]
     2     public sealed class ColumnFieldAttribute : Attribute
     3     {
     4         /// <summary>
     5         /// 表对应的字段名
     6         /// </summary>
     7         public string ColumnName { set; get; }
     8 
     9         public ColumnFieldAttribute(string columnName)
    10         {
    11             ColumnName = columnName;
    12         }
    13     }

    通过反射,将DataTable转换为数据列表

     1     /// <summary>
     2     /// 将DataRow/DataTable转换成Entity类型
     3     /// </summary>
     4     public static class DataTableConverter<T> where T : new()
     5     {
     6         /// <summary>
     7         /// 将DataTable转换成Entity列表
     8         /// </summary>
     9         /// <param name="dt"></param>
    10         /// <returns></returns>
    11         public static List<T> ToList(DataTable dt)
    12         {
    13             List<T> list = new List<T>(dt.Rows.Count);
    14             foreach (DataRow dr in dt.Rows)
    15             {
    16                 list.Add(ToEntity(dr));
    17             }
    18             return list;
    19         }
    20         /// <summary>
    21         /// 将DataRow行转换成Entity
    22         /// </summary>
    23         /// <param name="dr"></param>
    24         /// <returns></returns>
    25         private static T ToEntity(DataRow dr)
    26         {
    27             T entity = new T();
    28             Type info = typeof(T);
    29             var members = info.GetMembers();
    30             foreach (var memberInfo in members)
    31             {
    32                 if (memberInfo.MemberType == MemberTypes.Property)
    33                 {
    34                     //读取属性上的DataField特性
    35                     object[] attributes = memberInfo.GetCustomAttributes(typeof(ColumnFieldAttribute), true);
    36                     foreach (var attr in attributes)
    37                     {
    38                         var dataFieldAttr = attr as ColumnFieldAttribute;
    39                         if (dataFieldAttr != null)
    40                         {
    41                             var propInfo = info.GetProperty(memberInfo.Name);
    42                             if (dr.Table.Columns.Contains(dataFieldAttr.ColumnName))
    43                             {
    44                                 //根据ColumnName,将dataRow中的相对字段赋值给Entity属性
    45                                 propInfo.SetValue(entity,
    46                                     Convert.ChangeType(dr[dataFieldAttr.ColumnName], propInfo.PropertyType),
    47                                     null);
    48                             }
    49                         }
    50                     }
    51                 }
    52             }
    53             return entity;
    54         }
    55     }
  • 相关阅读:
    斗鱼的sidebar的实现简陋的demo
    angular JS中使用jquery datatable添加checkbox点击事件
    angular JS中使用jquery datatable添加ng-click事件
    Redis 中文文档
    操作word的
    Redis作为消息队列服务场景应用案例(入队和出队)
    nopcommerce 商城案例
    net 将手机号码中间的数字替换成星号
    V5客服
    EF 数据库迁移(Migration)
  • 原文地址:https://www.cnblogs.com/kybs0/p/11739587.html
Copyright © 2020-2023  润新知