2017-03-16 10 views
0

以前はDTOを使用していましたが、匿名オブジェクトを検出したため、すべてのブランドを取得するコントローラを取得しましたので、試してみることにしました。匿名オブジェクトの動作方法C#エンティティフレームワーク

DTOのを使用して私のgetメソッドは、次のようました:

public async Task <IHttpActionResult> GetBrand(int id) { 
    var brand = await db.Brand.Select(x => new { 
     brandDesc = x.brandDesc, 
     BrandId = x.BrandId, 
     brandLogoUrl = x.brandLogoUrl, 
     brandName = x.brandName, 
     Products = x.Products.Select(y => new { 
      productDesc = y.productDesc, 
      ProductId = y.ProductId, 
      productName = y.productName, 
      productPrice = y.productPrice, 
      productStock = y.productStock, 
      productStatus = y.productStatus, 
      productModifyDate = y.productModifyDate 
     }).ToList() 
    }).FirstOrDefaultAsync(x => x.BrandId == id); 
     if (brand == null) { 
      return NotFound(); 
     } 
     return Ok(brand); 
    } 

は匿名オブジェクトと私の新しいコードは次のようになります。

[{ 
"brandDesc": "Dicalc phos crys-forearm", 
"BrandId": 7, 
"brandLogoUrl": "http://dummyimage.com/159x219.png/5fa2dd/ffffff", 
"brandName": "ALK-Abello, Inc.", 
"Products": [ 
    { 
    "productDesc": "Unspecified umbilical cord complication complicating labor and delivery, antepartum condition or complication", 
    "ProductId": 70, 
    "productName": "Bigtax", 
    "productPrice": 4445.17, 
    "productStock": 39, 
    "productStatus": true, 
    "productModifyDate": "2016-06-03T08:26:24" 
    }, 
    { 
    "productDesc": "Adhesions of iris, unspecified", 
    "ProductId": 598, 
    "productName": "It", 
    "productPrice": 1240.36, 
    "productStock": 35, 
    "productStatus": false, 
    "productModifyDate": "2016-06-04T01:00:54" 
    } 
] 

public async Task <IHttpActionResult> GetBrand(int id) { 
    var brand = await db.Brand.Select(x => new { 
     x.brandDesc, 
     x.BrandId, 
     x.brandLogoUrl, 
     x.brandName, 
     x.Products 
    }).FirstOrDefaultAsync(x => x.BrandId == id); 
    if (brand == null) { 
     return NotFound(); 
    } 
    return Ok(brand); 
} 

はどちらも同じ出力を返します

}]

本当に私の質問は、C#コンパイラが内部オブジェクトをマップする方法を知っていて、例えばブランドクラスでプロパティを繰り返さない方法です。私はbrandIDとProductオブジェクトを持っていて、ProductクラスにbrandIdもあります。私は手動でブランドDTOのbrandIdを指定し、ProductDTOのそのプロパティを削除してデータを繰り返さないようにする必要がありますが、匿名オブジェクトを使用すると内部的にこれが実行され、内部オブジェクト(製品)もC#によって自動処理されます。

Products = x.Products.Select(y => new { 
    productDesc = y.productDesc, 
    ProductId = y.ProductId, 
    productName = y.productName, 
    productPrice = y.productPrice, 
    y.productStock, 
    y.productStatus, 
    y.productModifyDate}).ToList() 

そして唯一のプロパティを指定します。また、私は手動で匿名オブジェクト内のプロパティを指定することができることが判明:私はC#は手動でそれを

編集]を指定する必要がなく、これを行うことができることは本当に驚いて私が欲しいのは

+0

FYI私はあなたの 'Products'クラスが' BrandId'プロパティを持っているとは思わないので、それを読むのがとても難しいようにあなたのコードをフォーマットすると – maccettura

+0

と思います。ここには魔法はありません。コンパイラは、結果を整形することに関与していません。あなたが見ているのは、JsonのシリアライザであるJson.Netの結果だけです。それだけでもそのようなプロパティは削除されません。私は 'BrandId'はそこから始めるべきではないと確信しています* * *それは公共の財産ではありません、または* JsonIgnore属性を持っています。 –

答えて

1

ここに魔法はありません。コンパイラは、Brandオブジェクトから選択したものと同じ名前とタイプの5つのプロパティを持つ隠しクラスを作成するだけで、EFはdtosではなくそのようなオブジェクトをインスタンス化します。

+0

しかし、コンパイラはどのようにして繰り返しデータを避けていますか?私のブランドクラスでは、私はブランドIDを持っています。クラス内には、brandIdを持つProductプロパティがあります。コンパイラが匿名オブジェクトを作成すると、ProductオブジェクトのbrandIdプロパティが作成されません。 –

+0

2番目のスニペットで変更なしの商品コレクションを選択しています。製品エンティティ自体について何かが、brandsonプロパティがjsonに追加されないようにする必要があります。これは匿名型とは関係ありません。 –

関連する問題