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     }
  • 相关阅读:
    UVA 10618 Tango Tango Insurrection
    UVA 10118 Free Candies
    HDU 1024 Max Sum Plus Plus
    POJ 1984 Navigation Nightmare
    CODEVS 3546 矩阵链乘法
    UVA 1625 Color Length
    UVA 1347 Tour
    UVA 437 The Tower of Babylon
    UVA 1622 Robot
    UVA127-"Accordian" Patience(模拟)
  • 原文地址:https://www.cnblogs.com/kybs0/p/11739587.html
Copyright © 2011-2022 走看看