2017-04-24 18 views
0

私はビューの内容を表示したいordersテーブルを持っています。私は通常、このような操作を行います:、しかし別名を使用して一覧を表示するにはどうすればよいですか?

<th> 
     @Html.DisplayNameFor(model => model.OrderNum) 
    </th> 
    <td> 
     @Html.DisplayNameFor(model => model.CreateDate) 
    </td> 
    .... 
</th> 

私は同じテーブルToList()を表示したいが、私ならば、私は何をしますか:

return View(db.Orders.ToList()); 

はその後、私はビューに表示したいフィールドを呼び出しますDISTINCTOrderNum行を返すようにしたいと考えています。ここで私が試したものです:

辞書に渡されたモデルアイテムはタイプ「System.Collections.Generic.List 1[<>f__AnonymousType9 10 [可能System.Int32、である

次のエラーが返されました

var UserOrders = (from uo in db.Orders select new { uo.OrderNum, uo.CreateDate, ... }).ToList(); 
     var result = UserOrders.GroupBy(x=>x.OrderNum).Select(y=>y.First()); 
     return View(result.ToList()); 

System.String、System.String、System.String、System.Decimal、System.Nullable 1[System.Boolean],System.Nullable 1 [System.Boolean]、Project.Models.DeliveryOption]] 'この辞書にはモデルが必要です'System.Collections.Generic.IEnumerable`1 [Project.Models.Order]'タイプのアイテム。最後に明確な指示を無視し

return View(db.Orders.ToList().Distinct()); 

。それはすべてのレコードを返します。

答えて

1

あなたの最初の試みが近かったが、あなたはこれが動作するはず匿名型に突出する必要はありませんでした:

 var result = db.Orders.GroupBy(x=>x.OrderNum) 
      .Select(y=>y.FirstOrDefault()); 
     return View(result.ToList()); 

最後ので、私はFirstOrDefault()を使用しています私はEntity Frameworkがクエリ式の内部に.First()を実行したくないことを確認しました。

理由は.ToList().Distinct()は機能しませんでした。なぜなら、プログラムは2つのアドレスを "等しく"するものが分からないからです。そのため、デフォルトではメモリアドレスを調べます。すべての返されたオブジェクトは異なるメモリアドレスを持つので、それらはすべて一意であると考えます。

+0

ありがとう、それは働いた! – Skullomania

1

あなたのビューが強くIEnumerable<Project.Models.Order>タイプではありませんIEnumberable<Anonymous>にバインドされているような問題を引き起こしている匿名型に結果を投影している、あなたは、グループ化した後Orderに突出する必要があります

var UserOrders = (from uo in db.Orders 
        select new Order 
          { 
           OrderNum =uo.OrderNum, 
           CreatedDate = uo.CreateDate, ... 
           }).ToList(); 

を今すぐあなたの次のコードがします適切なタイプの結果を返します。

var result = UserOrders.GroupBy(x=>x.OrderNum).Select(y=>y.First()); 
return View(result.ToList()); 

プロジェクトとmaterializを実行しないと、実際にはデータベース側でグループ化を実行できます結果を以下のようにして返します。

var reuslt = db.Orders.GroupBy(x=>x.OrderNum) 
         .Select(x=>x.First()); 
return View(result.ToList()); 
0

これは匿名タイプを必要とせずに行うことができます。以下のようなものが動作するはずです:

return View(db.Orders.GroupBy(x=>x.OrderNum).Select(y=>y.First()).ToList()); 
+0

すでにGroupByを実行しているときに、その最終的なDistinct()は必要ありません。 – StriplingWarrior

+0

良い点は、そこに残すつもりはありませんでした。:) – Simon

関連する問題