关系对象映射 c#
Posted
技术标签:
【中文标题】关系对象映射 c#【英文标题】:Relational object mapping 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,您可能想要使用它。否则你必须自己编写所有代码,或者使用反射,这既糟糕又慢。 【参考方案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"] 调用的性能。因此,如果您希望在执行自己的性能测试时进行同类比较,则需要更改代码以也使用序数。以上是关于关系对象映射 c#的主要内容,如果未能解决你的问题,请参考以下文章