estoy utilizando LINQ a EF y tienen el siguiente LINQ consulta:mediante LINQ ¿Cómo puedo tener una agrupación por un "campo calculado"
var results = (from x in ctx.Items
group x by x.Year into decades
orderby decades.Count() descending
select new { Decade = decades.Key, DecadeCount = decades.Count() });
Así que este tipo de me lleva a donde quiero estar, en eso obtengo los artículos desglosados por año y un recuento de artículos en ese año. (es decir, 2001 - 10, 1975 - 15, 2005 - 5, 1976 - 1) Lo que realmente quiero hacer es desglosarlos por década (es decir, 2000s - 15, 1970s - 16).
¿Cómo se tiene un "campo calculado" en la parte "por" de la cláusula de grupo para una instrucción Linq. Creo que lo que quiero es básicamente algo como:
var results = (from x in ctx.Items
group x by (x => x.Year.Value.ToString().Substring(0, 3) + "0s") into decades
orderby decades.Count() descending
select new { Decade = decades.Key, DecadeCount = decades.Count() });
o más generalmente la sintaxis para que pueda hacer algo más complicado de evaluación/cálculo para hacer el grupo por sobre. ¿Algunas ideas?
EDITAR (actualización):
(. X => x.Year.Value.ToString() Subcadena (0, 3) + "0s") - no funciona - "LINQ a Entidades no lo hace reconocer el método 'System.String ToString()' método, y este método no se puede traducir a una expresión de tienda. "
(x.Year/10 * 10) - Funcionalmente obras (gracias) - el único "problema" es que la 's' no está en el extremo (es decir, 1970 vs. 1970)
¿Hay de todos modos para poner una función en la cláusula by? es decir, agrupar x por este. ManipularAño (x.Año) en décadas ... o ... x => x.Año.Valor.ToString(). Subcadena (0,3) + "0s" ?? Sería bueno tener alguna técnica (como llamar a una función o usar una expresión lambda) para poder cubrir cualquier caso que se me ocurra.
Gracias de nuevo por la ayuda de todos en esto.
No, una agrupación que ya es un IEnumerable de IEnumerables (como IGrouping extiende IEnumberable). No hay necesidad de SelectMany aquí. –