目前,我正在使用这样的东西:
try
{
dr = SQL.Execute(sql);
if(dr != null) {
while(dr.Read()) {
CustomObject c = new CustomObject();
c.Key = dr[0].ToString();
c.Value = dr[1].ToString();
c.Meta = dr[2].ToString();
customerInfo.CustomerList.Add(c);
}
}
else
{
customerInfo.ErrorDetails="No records found";
}
有没有一种方法可以直接进行此映射(假设列名称与字段名称匹配),而不是我手动进行分配。
然而,一个要求是我想通过当前使用 sql 查询的方法而不是使用纯基于 LINQ 的方法来完成此操作。其一,SQL 查询足够大,涉及复杂的 JOIN,并且已经过彻底测试,因此我目前不想引入更多错误。有什么建议么?
一个简单的解决方案是为您创建一个构造函数CustomObject
这需要一个DataRow
(来自示例,所以如果是另一个类,请纠正我)。
在您的新构造函数中,按照您自己的示例中的操作进行操作。
public CustomObject(DataRow row)
{
Key = row[0].ToString();
// And so on...
}
另一种方法是引入泛型,并在 SQL 类中创建一个新函数
示例(代码来自将参数传递给模板类型的 C# 泛型 new() https://stackoverflow.com/questions/840261/passing-arguments-to-c-sharp-generic-new-of-templated-type):
// This function should reside in your SQL-class.
public IEnumerable<T> ExecuteObject<T>(string sql)
{
List<T> items = new List<T>();
var data = ExecuteDataTable(sql); // You probably need to build a ExecuteDataTable for your SQL-class.
foreach(var row in data.Rows)
{
T item = (T)Activator.CreateInstance(typeof(T), row);
items.Add(item);
}
return items;
}
用法示例:
public IEnumerable<CustomObject> GetCustomObjects()
{
return SQL.ExecuteObject<CustomObject>("SELECT * FROM CustomObject");
}
我已经在 LinqPad 中测试了这段代码,它应该可以工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)