Tengo una tabla de pedidos cuyo contenido quiero mostrar en la vista. Normalmente haría esto como:

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

Luego llame a los campos que deseo mostrar en la vista:

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

Sin embargo, ¿qué debo hacer si quiero mostrar la misma tabla ToList() pero quiero hacerlo para que devuelva DISTINCT OrderNum filas. Esto es lo que he intentado:

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

Que devolvió el siguiente error

El elemento de modelo pasado al diccionario es de tipo '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]] ', pero este diccionario requiere un elemento de modelo de tipo' System.Collections.Generic.IEnumerable`1 [Project.Models .Orden]'.

Y

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

Lo que ignora el comando distinto al final. Como devuelve todos los registros.

0
Skullomania 24 abr. 2017 a las 19:09

3 respuestas

La mejor respuesta

Tu primer intento fue cercano, pero no necesitas proyectar a un tipo anónimo. Esto debería funcionar:

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

Estoy usando FirstOrDefault() porque la última vez que revisé Entity Framework no le gusta hacer .First() dentro de una expresión de consulta.

La razón por la que .ToList().Distinct() no funcionó es porque el programa no sabe qué hace que dos Order s sean "iguales", por lo que el valor predeterminado es mirar su dirección de memoria. Dado que todos los objetos devueltos tienen diferentes direcciones de memoria, cree que todos son únicos.

1
StriplingWarrior 24 abr. 2017 a las 16:15

Puede hacer esto sin la necesidad de tipos anónimos. Algo como lo siguiente debería funcionar:

return View(db.Orders.GroupBy(x=>x.OrderNum).Select(y=>y.First()).ToList());
0
Simon 24 abr. 2017 a las 16:16

Está proyectando el resultado en tipo anónimo , lo que está causando problemas ya que su vista está fuertemente ligada con el tipo IEnumerable<Project.Models.Order> no IEnumberable<Anonymous>, debe proyectar a Order después de agrupar :

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

Ahora su próximo código devolverá el tipo de resultado adecuado:

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

De hecho, puede hacer la agrupación en el lado de la base de datos si no proyecta y materializa el resultado haciendo:

var reuslt = db.Orders.GroupBy(x=>x.OrderNum)
                      .Select(x=>x.First());
return View(result.ToList());
1
Ehsan Sajjad 24 abr. 2017 a las 16:18