[英]How do I display a table to list using distinct?
我有一個要在視圖中顯示其內容的訂單表。 我通常會這樣:
return View(db.Orders.ToList());
然后調用我希望在視圖中顯示的字段:
<th>
@Html.DisplayNameFor(model => model.OrderNum)
</th>
<td>
@Html.DisplayNameFor(model => model.CreateDate)
</td>
....
</th>
但是,如果我想顯示相同的表ToList()
但又想使它顯示以便返回DISTINCT
OrderNum
行,該怎么OrderNum
。 這是我嘗試過的:
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.Collections.Generic.List
1[<>f__AnonymousType9
10 [System.Int32,System.DateTime,System.String,System.String,System.String,System.String,System .Decimal,System.Nullable1[System.Boolean],System.Nullable
1 [System.Boolean],Project.Models.DeliveryOption]],但此字典需要類型為'System.Collections.Generic.IEnumerable'的模型項。 1 [Project.Models.Order]'。
和
return View(db.Orders.ToList().Distinct());
最后忽略了不同的命令。 因為它返回所有記錄。
您正在將結果投影到匿名類型 ,這會導致問題,因為您的視圖與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());
如果您不通過以下方式進行投影和實現結果,則實際上可以在數據庫端進行分組:
var reuslt = db.Orders.GroupBy(x=>x.OrderNum)
.Select(x=>x.First());
return View(result.ToList());
您的第一次嘗試已結束,但是您無需投影為匿名類型。這應該可以:
var result = db.Orders.GroupBy(x=>x.OrderNum)
.Select(y=>y.FirstOrDefault());
return View(result.ToList());
我正在使用FirstOrDefault()
因為最后我檢查了Entity Framework不喜歡在查詢表達式中執行.First()
。
.ToList().Distinct()
不起作用的原因是因為程序不知道是什么使兩個Order
等於“相等”,所以它默認情況下查看其內存地址。 由於所有返回的對象都具有不同的內存地址,因此認為它們都是唯一的。
您可以執行此操作,而無需使用匿名類型。 類似於以下內容的東西應該起作用:
return View(db.Orders.GroupBy(x=>x.OrderNum).Select(y=>y.First()).ToList());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.