1

この質問は、このフォーラムで常に尋ねられていることかもしれませんが、必要な質問が見つかりません。私の問題は、このような複合クラスがあることです

class Customer
{
   private int Id { set; get; } 
   private int Name { set; get; }
   private Company Company { set; get; }
   ...
}

class Company
{
   private int Id { set; get; }
   private string Name { set; get; }
   ...
}

顧客データを取得するとき

string sql = "SELECT cust.id, cust.name, comp.name AS [CompanyName] FROM Customer cust INNER JOIN Company comp ON cust.Company = comp.Id";
....
using (IDataReader dr = db.ExecuteReader(cmd))
{
    if (dr.Read())
    {
        customer = (Customer)FillDataRecord(dr, customer);
    }
}

リフレクション、コードを使用して Customer クラス (オブジェクト) にマッピングします。

public static Object FillDataRecord(IDataRecord dr, Object obj)
{
    try
    {
        Type type = obj.GetType();
        PropertyInfo[] properties = type.GetProperties();

        for (int i = 0; i < dr.FieldCount; i++)
        {
            if (!dr[i].ToString().Equals(string.Empty))
            {
                type.GetProperty(dr.GetName(i)).SetValue(obj, dr[i], null);
            }
        }

        return obj;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

CompanyName をマッピングすると、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが返されます。私はデバッグして問題を知っていますが、今のところ解決できません。

AutoMapper または Dapper については知っていますが、このケースに適用すると、同じ問題も発生します。

今、私は ValueInjecter を使用しています。読んだことから、問題を解決できます。しかし、私は cust.Company.Id および cust.Name = "" および cust.Company.Name = "" と同じ cust.Id 値を持っています

string sql = "select cust.id, cust.name, comp.name from customer cust inner join company comp on cust.company = comp.id";

while (dr.Read())
{
   var cust = new Customer();
   cust.InjectFrom<ReaderInjection>(dr);

   cust.Company = new Company();
   cust.Company.InjectFrom<ReaderInjection>(dr);

   list.add(cust);
}

何か間違っていることでも?私を助けてください。

4

1 に答える 1

2

なぜオブジェクトを使用しているのですか? なぜジェネリックにしないのですか?そのようです:

public static T FillDataRecord<T>(IDataRecord dr) where T : new()
{
    T returnedInstance = new T();
    string fieldName = default(string);

    try
    {
        PropertyInfo[] properties = typeof(T).GetProperties();

        fieldName = dr.GetName(i);

        foreach (PropertyInfo property in properties)
        {
            if (property.Name == fieldName)
            {
                // Handle the DBNull conversion issue..
                if (dr.GetValue(i) == DBNull.Value)
                    property.SetValue(returnedInstance, null, null);
                else
                    property.SetValue(returnedInstance, dr[i], null);
            }
        }

        return returnedInstance;
    }
    catch (Exception ex)
    {
        // Handle exception here
    }
}

次に、これを行うことができます:

Customer _customer = FillDataRecord<Customer>(dr);

または、これ:

CustomerDetails _customerDetails = FillDataRecord<CustomerDetails>(dr);

あなたの質問に答えて..データベースからNULLを取得する可能性がある場合..それを確認する必要があります。

于 2011-10-27T09:16:59.987 に答える