我的课程如下:
class SalesInvlice
{
int id {get;set;}
string number {get;set;}
List<InvoiceItems> {get;set}
}
class InvoiceItems
{
id {get;set}
string item_name {get;set}
int price {get;set;}
}
我的应用程序是一个代理程序,可以连接到配置文件中指定的任何数据库,并执行某个查询。在我的情况下,它将在一个客户端数据库上执行查询,如下所示select id, number, items.id as items_id, item_name, price from transaction left join transaction_details on transactions.id = transaction_details.transaction_id
假设我使用SQLDataReader获取数据,但我也在其他解决方案中打开。
我在这里寻找的是将SQLDataReader的结果映射到SalesInvoice对象列表。
我面临的问题是,如果事务具有transaction_details列表,这意味着datareader将在不同的行中将它们传递给我。
答案 0 :(得分:0)
您可以选择在一个或两个数据集中返回数据。第一个将返回重复的交易数据,见下文。您需要管理dr重复交易。
select id,
number,
items.id as items_id,
item_name, price
from transaction
left join transaction_details
on transactions.id = transaction_details.transaction_id
或者将数据返回两组数据(事务和事务详细信息)。我假设您对特定交易的数据感兴趣而不是很多不同的交易。 Ado.net将允许返回多组数据。您需要将每个数据集转换为对象类型。模糊地说是一个新的交易和分配属性的案例。
答案 1 :(得分:0)
要解决这个问题,我已经制作了我的simi通用映射器。
我有mapper执行以下操作:
private List<T> mappingFun<T>( IEnumerable<Dictionary<string, object>> args, object propListObj = null) where T: Entity
{
List<T> listObject = new List<T>();
foreach(var arg in args)
{
T returnedObject = Activator.CreateInstance<T>();
PropertyInfo[] modelProperties = returnedObject.GetType().GetProperties();
var addedobject = listObject.FirstOrDefault(x => x.name == arg[returnedObject.GetType().Name + "_name"].ToString());
if (addedobject != null)
{
returnedObject = addedobject;
}
foreach(var prop in modelProperties)
{
var a = prop.PropertyType;
if (prop.PropertyType == typeof(String))
{
prop.SetValue(returnedObject, arg[returnedObject.GetType().Name + "_" + prop.Name].ToString());
}
else
{
var propModuleObj = GetType().GetMethod("mappingFun", BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(IEnumerable<Dictionary<string, object>>), typeof(object) }, null).MakeGenericMethod(prop.PropertyType.GetGenericArguments().Single()).Invoke(this, new object[] { new List<Dictionary<string, object>>() { arg }, prop.GetValue(returnedObject) });
prop.SetValue(returnedObject, propModuleObj);
}
}
listObject.AddIfNotExist(returnedObject);
if(propListObj != null)
listObject.AddRange((List<T>)propListObj);
}
return listObject;
}
这有助于100%