0

ご覧いただきありがとうございます。

バックグラウンド

C# コード内で、ユーザーが行った注文の履歴を返す MSSQL データベースからストアド プロシージャを呼び出しています。これには Entity Framework を使用します。コードは次のとおりです。

var db = new CustomerEntities();
return db.GetOrderHistoryByUserId(id);

OrderNumberこのストアド プロシージャの出力は、特定の注文に複数の製品が存在する可能性があるため、同じレコードを持つ複数のレコードを含む注文のリストです。そこで、コードを次のように変更しました。

var db = new CustomerEntities();
return db.GetOrderHistoryByUserId(id).GroupBy(p => p.OrderNumber);

Orderネストされたオブジェクトを含むオブジェクトのリストを取得したいと思っていましたProductが、代わりに、このコードは基本的に以前と同じ応答を生成しました。

最終的には、このクエリを次のような JSON レスポンスに変換したいだけです。

Orders : [
{
OrderNumber : 1,
OrderTotal: $500,
Products: [
  {ProductSku : 11111, ProductPrice: $200},
  {ProductSku : 22222, ProductPrice: $300}
]
}
]

JSON出力の生成を支援するためにMVC 4を使用しているため、その部分についてはすでに明確です.目的の構造を持つオブジェクトの配列を生成する方法でストアドプロシージャの結果を使用する方法を知る必要があるだけです.

質問

ストアド プロシージャへの元の LINQ 呼び出しを使用して、この目的のオブジェクト構造を生成する方法はありますか?それとも、ストアド プロシージャの結果を反復処理して新しいオブジェクトを構築する必要がありますか?

ご協力いただきありがとうございます!

4

2 に答える 2

2
var serializer = new JavaScriptSerializer();
var rows = db.GetOrderHistoryByUserId(id);
var json = serializer.Serialize(
       new { Orders = rows.GroupBy(o => o.Number)
                          .Select(g =>
                                new
                                {
                                    OrderNumber = g.Key,
                                    OrderTotal = g.Sum(o => o.Price),
                                    Products = g.Select(
                                       o => new {SKU = o.Sku, ProductPrice = o.Price}
                                    )
                                 })
            });
于 2012-11-02T00:00:30.337 に答える
1

私は実際に投稿する前にこれについてヘルプを検索しましたが、たった今答えを見つけました. Select句が必要でした:

var db = new CustomerEntities();
return db.GetOrderHistoryByUserId(id).GroupBy(o => o.OrderNumber).Select(g => new {Order = g.Key, Items = g}); 

ここをクリックして、最終的に私を助けたウェブページをご覧ください。

これが誰かに役立つことを願っています。

于 2012-11-01T21:49:46.623 に答える