zoukankan      html  css  js  c++  java
  • 数据库查询

    当使用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     }
  • 相关阅读:
    JAX XML 实例
    javascript获取浏览器的全部信息
    如何防止ASP.NET应用程序中的SQL注入安全漏洞
    测试Web应用程序是否存在跨站点脚本漏洞()
    C# 中的委托和事件详解(四)
    C# 中的委托和事件详解(一)
    远程启动SSIS包
    AX2012学习笔记Date Effectiveness(有效期间)
    AX2010学习笔记Surrogate Key(代理键)
    SSRS 2005 400 Bad Request
  • 原文地址:https://www.cnblogs.com/kybs0/p/11739587.html
Copyright © 2011-2022 走看看