如何将DataReader映射到类属性并保持性能?

如何解决如何将DataReader映射到类属性并保持性能?

| 前言: 所有数据连接字符串, 连接等使用 DbProviderFactories。 代码是从C#和VB.Net混合而成的 多库。 我正在将DbDataReader映射到实体并具有一些基准:
[0] retrieved 159180 records in 45135 ms
[1] retrieved 159180 records in 45008 ms
[2] retrieved 159180 records in 44814 ms
[3] retrieved 159180 records in 44987 ms
[4] retrieved 159180 records in 44914 ms
[5] retrieved 159180 records in 45224 ms
[6] retrieved 159180 records in 45829 ms
[7] retrieved 159180 records in 60762 ms
[8] retrieved 159180 records in 52128 ms
[9] retrieved 159180 records in 47982 ms  
考虑到从sql Server Management Studio进行查询只需要17秒,这是一个相当长的时间,而且非常糟糕。我的选择语句: \“ SELECT * FROM tbl_MyTable \” 该表包含43个字段,可能未按应有的最佳索引编制。但是,执行全选,我不希望索引会出现问题。所以...这是我在做什么: 定义实体:
public class Concept
{
    #region Columns
    [DataParameter(\"ConceptID\",DbType.Int32)]
    public Int32 ConceptID
    { get; set; }
    [DataParameter(\"ConceptName\",DbType.String)]
    public string ConceptName
    { get; set; }
    [DataParameter(\"ConceptTypeID\",DbType.Int32)]
    public Int32 ConceptTypeID
    { get; set; }
    [DataParameter(\"ActiveYN\",DbType.Boolean)]
    public bool ActiveYN
    { get; set; }
    #endregion
}
查询DataReader:
for (int i = 0; i <= 99; i++)
{
    sw.Start();
    var results = session.QueryReader<Concept>(
        new sqlCommand(command),dr => new Concept());

    sw.Stop();

    Console.WriteLine(\"[{0}] retrieved {1} records in {2} ms\",i,results.Count(),sw.ElapsedMilliseconds);
    sw.Reset();
}
...致电:
Public Function QueryReader(Of TEntity As {Class,New})(ByVal Command As DbCommand,_
                                                        ByVal Projection As Func(Of DbDataReader,TEntity)) _
                                                        As IEnumerable(Of TEntity)

    Dim list As IEnumerable(Of TEntity)

    Command.Connection = dataReader.NewConnection
    Command.Connection.open()

    Using _reader As DbDataReader = Command.ExecuteReader()
        list = _reader.Query(Of TEntity)(Projection).ToList()
    End Using

    Command.Connection.Close()

    Return list
End Function
...和扩展方法
QueryReader<T>
:编辑新的TEntity()的位置-感谢@Henk
public static IEnumerable<TEntity> Query<TEntity>(this DbDataReader Reader,Func<DbDataReader,TEntity> Projection)
    where TEntity : class,new()
{
    //   moving this reflection to another class
    Dictionary<string,PropertyInfo> props;

    while (Reader.Read())
    {
        TEntity entity = new TEntity();

        if (!entities.TryGetValue(typeof(TEntity).ToString(),out props))
        {
            //  reflection over TEntity
            props = (from p in entity.GetType().GetProperties()
                     from a in p.GetCustomAttributes(typeof(DataParameterattribute),false)
                     select p)
                     .ToDictionary(p => p.Name);

            entities.Add(typeof(TEntity).ToString(),props);
        }

        foreach (keyvaluePair<string,PropertyInfo> field in props)
        {
            if (null != Reader[field.Key] && Reader[field.Key] != dbnull.Value)
            { field.Value.SetValue(entity,Reader[field.Key],null); }
        }

        yield return entity;
    }
}
任何有关提高性能的建议将不胜感激... 更新资料 我按照@EtienneT的建议实现了dapper-dot-net-这是检索时间:
[0] retrieved 159180 records in 6874 ms
[1] retrieved 159180 records in 6866 ms
[2] retrieved 159180 records in 6570 ms
[3] retrieved 159180 records in 6785 ms
[4] retrieved 159180 records in 6693 ms
[5] retrieved 159180 records in 6735 ms
[6] retrieved 159180 records in 6627 ms
[7] retrieved 159180 records in 6739 ms
[8] retrieved 159180 records in 6569 ms
[9] retrieved 159180 records in 6666 ms
    

解决方法

您是否考虑过像dapper.net这样的微型ORM? https://github.com/StackExchange/dapper-dot-net 它由StackOverflow的开发人员制作,并将SQL查询直接映射到您的对象。它生成并缓存IL代码以将SQL结果映射到您的对象。因此,每种类型仅生成一次IL代码。从未使用过它,但是如果您需要性能以将SQL结果映射到.net对象,则需要它。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?