我有一个订单表,我想在视图中显示内容。我通常会这样做:
return View(db.Orders.ToList());
然后调用我希望在视图中显示的字段:
<th>
@Html.DisplayNameFor(model => model.OrderNum)
</th>
<td>
@Html.DisplayNameFor(model => model.CreateDate)
</td>
....
</th>
但是,如果我想显示相同的表ToList()
,但我想这样做,以便返回DISTINCT
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());
在最后忽略了distinct命令。因为它返回所有记录。
答案 0 :(得分: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());
如果您没有通过执行以下方式投影并实现结果,那么您实际上可以在数据库端执行分组操作:
var reuslt = db.Orders.GroupBy(x=>x.OrderNum)
.Select(x=>x.First());
return View(result.ToList());
答案 1 :(得分:1)
您的第一次尝试已接近,但您不需要投射到匿名类型这应该有效:
var result = db.Orders.GroupBy(x=>x.OrderNum)
.Select(y=>y.FirstOrDefault());
return View(result.ToList());
我使用FirstOrDefault()
,因为最后我检查过实体框架并不想在查询表达式中执行.First()
。
.ToList().Distinct()
无效的原因是因为该程序不知道是什么让两个Order
s&#34;等于&#34;所以它默认为他们的记忆地址。由于所有返回的对象都有不同的内存地址,因此它认为它们都是唯一的。
答案 2 :(得分:0)
您可以在不需要匿名类型的情况下执行此操作。以下内容应该有效:
return View(db.Orders.GroupBy(x=>x.OrderNum).Select(y=>y.First()).ToList());