将行数据映射到MyObject

时间:2017-05-01 12:22:37

标签: c# sql-server automapper

我的课程如下:

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将在不同的行中将它们传递给我。

2 个答案:

答案 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%