【问题标题】:Relational object mapping c#关系对象映射 c#
【发布时间】:2013-05-27 17:34:00
【问题描述】:

映射关系表的最佳方法是什么? 超过 150 列。我不想使用任何第三方或实体框架。如果 我正在使用数据阅读器,很难写出所有的列和 将其转换为相关类型。

有没有简单的方法或者这是唯一的方法?

 SqlDataReader _dr = _sqlCom.ExecuteReader() ;

        Info inObj= new Info ();


        while (_dr.Read())
        {

            inObj.a=  (int)_dr["a"];
            inObj.b= (int)_dr["b"];
            inObj.c= (int)_dr["c"];
            inObj.d= (int)_dr["d"];
            inObj.e= (int)_dr["e"];
            .....

            ......
        }

【问题讨论】:

  • 有一个名为PetaPOCO的微ORM。如果您不想要真正的 ORM,您可能想要使用它。否则你必须自己编写所有代码,或者使用反射,这既糟糕又慢。

标签: c# orm mapping data-access-layer data-access


【解决方案1】:

如果你想为你完成它,你需要使用 ORM,那里有一些好的,比如Dapper,或者使用反射(但会慢一些)。否则你需要自己处理这一切。然而,除了丑陋的转换之外,您可以编写更多的代码来摆脱转换,并且可能会表现得更好

SqlDataReader _dr = _sqlCom.ExecuteReader() ;


Info inObj = new Info();

if (!_dr.HasRows) { return; }

int aPosition = _dr.GetOrdinal("a");}
int bPosition = _dr.GetOrdinal("b");
int cPosition = _dr.GetOrdinal("c");
int dPosition = _dr.GetOrdinal("d");
int ePosition = _dr.GetOrdinal("e");

while (_dr.Read())
{
    inObj.a = _dr.GetInt32(aPosition);
    inObj.b = _dr.GetInt32(bPosition);
    inObj.c = _dr.GetInt32(cPosition);
    inObj.d = _dr.GetInt32(dPosition);
    inObj.e = _dr.GetInt32(ePosition);

    .....

    ......
}

【讨论】:

    【解决方案2】:

    您可以使用反射,如果您可以承受性能损失的话。像这样的东西应该可以工作:

    SqlDataReader reader = ...;
    var propertyMappings = typeof (Info).GetProperties(BindingFlags.Instance | BindingFlags.Public)
        .Select(p => new {Property = p, Ordinal = reader.GetOrdinal(p.Name)})
        .ToList();
    while (reader.Read())
    {
        var info = new Info();
        foreach (var propertyMapping in propertyMappings)
            propertyMapping.Property.SetValue(info, reader[propertyMapping.Ordinal]);
    }
    

    【讨论】:

    • 我不知道确切的数字,但这并不是微不足道的。在许多情况下,这不是问题,但如果您正在处理 10 列的 100K 行,它可能会增加您的问题。您可能需要进行自己的测试。请注意,上面的代码在进入 Read() 循环之前提取了每个属性的序号。这将提高基于字符串的 reader["column"] 调用的性能。因此,如果您希望在执行自己的性能测试时进行同类比较,则需要更改代码以也使用序数。
    猜你喜欢
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    相关资源
    最近更新 更多