2010-03-22 23 views
5

tengo un simple consulta SQL:Recuento de registros en C# utilizando LINQ

Select ID, COUNT(ID) as Selections, OptionName, SUM(Units) as Units 
FROM tbl_Results 
GROUP BY ID, OptionName 

Los resultados que obtuve eran:

'1' '4' 'Approved' '40' 
'2' '1' 'Rejected' '19' 
'3' '2' 'Not Decided' '12' 

tengo para cifrar los datos en la base de datos, y como tal la mañana incapaz de sumar los datos en forma relacional. Para evitar esto, desencripto los datos en la capa de aplicación y quiero usar LINQ para consultarlo allí. Necesito los siguientes resultados:

'1' 'Approved'  '10' 
'3' 'Not Deceided' '6' 
'2' 'Rejected'  '19' 
'1' 'Approved'  '15' 
'1' 'Approved'  '5' 
'3' 'Not Deceided' '6' 
'1' 'Approved'  '10' 

pongo estos resultados en clase y crear una lista inflexible:

public class results 
{ 
public int ID {get;set;} 
public string OptionName {get;set;} 
public int Unit {get;set;} 
} 

casi tengo la consulta LINQ para traer de vuelta los resultados como la consulta SQL sobre:

var q = from r in Results 
     group p.Unit by p.ID 
     int g 
     select new {ID = g.Key, 
        Selections = g.Count(), 
        Units = g.Sum()}; 

¿Cómo puedo garantizar que mi consulta LINQ también me proporcione el Option Name?

Si creé una clase llamada Statistics para contener mis resultados, ¿cómo modificaría la consulta LINQ para darme el resultado List<Statistics>?

public class results 
    { 
    public int ID {get;set;} 
    public int NumberOfSelections { get; set; } 
    public string OptionName {get;set;} 
    public int UnitTotal {get;set;} 
    } 

Respuesta

4

Actualmente se acaba de agrupación por la ID. En cambio, según la consulta original, también debe agrupar por el nombre de la opción. De esta forma, la clave de cada grupo contendrá tanto el ID como el nombre de la opción. He aquí sólo que el cambio:

var q = from r in Results 
     group r.Unit by new { p.ID, p.OptionName } into g 
     select new { ID = g.Key.ID, 
        OptionName = g.Key.OptionName 
        Selections = g.Count(), 
        UnitTotal = g.Sum() }; 

Ahora bien, no era inmediatamente obvio para mí que estuviera seleccionando sólo la parte de "unidad" para el elemento de grupo. Extrañé "group p.Unit by" en la expresión de consulta. Mi mal ... pero otros pueden hacer lo mismo. Aquí hay una alternativa, lo que hace que el grupo contiene los artículos, y después suma las unidades en la proyección:

var q = from r in Results 
     group r by new { p.ID, p.OptionName } into g 
     select new { ID = g.Key.ID, 
        OptionName = g.Key.OptionName 
        Selections = g.Count(), 
        UnitTotal = g.Sum(x => x.Unit) }; 
+0

Me alegro de haber tardado demasiado en responder. Iba a sugerir algo como "resultado de grupo por result.ID" y luego "OptionName = g.Select (result => result.OptionName) .First()". Lo cual probablemente sería demasiado. –

1

Esta consulta por grupos Identificación y nombre de la opción por lo que es disponible:

var q = from r in Results 
     group p.Unit by new { ID = p.ID, OptionName = p.OptionName } into g 
     select new { 
      ID = g.Key.ID, 
      OptionName = g.Key.OptionName, 
      Selections = g.Count(), 
      Units = g.Sum() 
     }; 

para devolver su uso a medida clase de resultado:

var q = from r in Results 
     group p.Unit by new { ID = p.ID, OptionName = p.OptionName } into g 
     select new results() { 
      ID = g.Key.ID, 
      OptionName = g.Key.OptionName, 
      NumberOfSelections = g.Count(), 
      UnitTotal = g.Sum() 
     }; 
+1

No es necesario especificar los nombres de las propiedades de un tipo anónimo si la expresión utilizada para recuperar el valor es ya es apropiado - vea mi respuesta para un ejemplo. –

Cuestiones relacionadas