2011-07-19 3 views
0

私はオブジェクトマッピングで自分自身を繰り返さないようにいくつかのメソッドをリファクタリングしようとしています。機能はこのSO questionに配置されています。同様のlinq2sqlで生成された結果を単一のオブジェクトにマップするにはどうすればよいですか?

私は4つのストアドプロシージャのうちの1つを呼び出し、同じフィールドで結果を返すジェネリックメソッドを持ち、異なるデータサブセットのみを返します。 linq2sqlは、ストアドプロシージャごとに異なるResultオブジェクトを生成します。

結果をサーバーオブジェクトに一般的にマップする方法はありますか?反射が必要ですか?

private static List<DistroHeader> getHeaders<T>(Func<IEnumerable<T>> getHeaders) 
{ 
    List<MyObj> myObj = new List<MyObj>(); 

    var result = from a in getMyObjData() 
       select a; 

    foreach (var row in result) 
     { 
      myObj.Add(new MyObj() 
      { 
       Id = row.id, 
       Description = row.descr, 
       // ...etc 
       // These fields are shared across the result types... 
       // is there a way to make the compiler recognize that? 
      }); 
     } 
} 

答えて

0

は良い習慣ではありませんが、これは私がやったことです:

 var result = from a in getMyObjData() 
        select new { Id = a.id, Description = a.description }; 

LINQのための優れたリソース:

private static List<DistroHeader> getHeaders<T>(Func<IEnumerable<T>> getHeaders) 
{ 
    List<MyObj> myObj = new List<MyObj>(); 

    var result = from a in getMyObjData() 
       select a; 

    var pi = new List<PropertyInfo>(typeof(T).GetProperties()); 

    foreach (var row in result) 
    { 
     myObj.Add(new MyObj() 
     { 
      Id = (int)pi.Find(x => x.Name == "id").GetValue(row, null), 
      Description = (string)pi.Find(x => x.Name == "descr").GetValue(row, null), 
      // ...etc  
     }); 
    } 
} 
0

AutoMapperを使用して調べます。私はこれを推測している

1

LINQは、次のようなものになるだろう101 Linq Samplesです。


EDIT:
それはあなたのニーズが何であるかに依存します。上記は、一般的なオブジェクトを作成する本当に簡単な例です。

あなたが必要とするタイプのオブジェクトを実際に作成しているため、あなたの質問に対するより良い回答は、以下に示すようなものでした。

MyObject newOject = from item in getMyObjData() 
        select new MyObject() 
          { 
           Id = item.Id, 
           Description = item.description 
          }; 
+0

コンパイル時に型を知らずにこれを行うのですか? – IronicMuffin

関連する問題