如何使用distinct显示要列出的表?

时间:2017-04-24 16:09:11

标签: c# asp.net-mvc linq

我有一个订单表,我想在视图中显示内容。我通常会这样做:

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.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());

在最后忽略了distinct命令。因为它返回所有记录。

3 个答案:

答案 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());