2010-05-24 33 views
6

He sido programador desde hace algunos años pero soy
recién llegado a LINQ y C# así que discúlpeme si mi pregunta suena
particularmente estúpido.¿Cómo puedo crear una consulta LINQ dinámica en C# con posibles cláusulas de múltiples grupos por?

Espero que alguien pueda señalarme en la dirección
correcta. Mi tarea es crear la capacidad de formar un grupo múltiple dinámico
mediante la consulta linq dentro de un script C# usando
una lista genérica como fuente.

Por ejemplo, decir que tengo una lista que contiene varios elementos, con el siguiente
estructura:

FieldChar1 - character 
FieldChar2 - character 
FieldChar3 - character 
FieldNum1 - numeric 
FieldNum2 - numeric 

En pocas palabras quiero ser capaz de crear una consulta LINQ que
se suma FieldNum1 y FieldNum2 agrupados por cualquiera, dos o
los tres campos de FieldChar que se decidirán en
tiempo de ejecución dependiendo de los requisitos de los usuarios, así como de seleccionar los campos de FieldChar en la misma consulta.

Tengo los dynamic.cs en mi proyecto que incluye un método de extensión GroupByMany, pero tengo que admitir que no estoy seguro de cómo usarlos. Puedo obtener los resultados deseados si utilizo una consulta con un grupo cableado por solicitudes pero no de forma dinámica.

Disculpas por cualquier nomenclatura errónea, soy nuevo en este lenguaje, pero cualquier consejo sería bienvenido.

Muchas gracias

Alex

Respuesta

1

Aquí es el GroupBy ejemplo básico. Digamos que tenemos una clase simple como esto:

public class Person 
{ 
    public string Name { get; set; } 

    public int Age { get; set; } 

    public char Sex { get; set; } 
} 

A continuación, puede utilizar GroupBy así:

var people = new List<Person> { 
    new Person { Name = "Joe", Age = 30, Sex = 'M' }, 
    new Person { Name = "Liz", Age = 22, Sex = 'F' }, 
    new Person { Name = "Jim", Age = 22, Sex = 'M' }, 
    new Person { Name = "Alice", Age = 30, Sex = 'F' }, 
    new Person { Name = "Jenny", Age = 22, Sex = 'F' } 
}; 
var groups = people.GroupBy(p => p.Age); 

foreach (var group in groups) 
{ 
    foreach (var person in group) 
     Console.WriteLine(person.Name + " - " + person.Age); 
} 

En cuanto a la agrupación de múltiples propiedades, consulte los siguientes:
http://weblogs.asp.net/zeeshanhirani/archive/2008/05/07/group-by-multiple-columns-in-linq-to-sql.aspx
LINQ TO DataSet: Multiple group by on a data table

Básicamente, es la misma sintaxis con un tipo anónimo, por ejemplo:

var groups = people.GroupBy(p => new { p.Age, p.Sex }); 

Tenga en cuenta que puede estar buscando usando múltiples OrderBy s:

var query = people.OrderBy(p => p.Age).ThenBy(p => p.Sex); 
//You can have unlimited ThenBy's 

También tenga en cuenta que el resultado de la última declaración GroupBy y el resultado de esta declaración OrdenarPor NO es lo mismo.

+0

Muchas gracias por su respuesta. Lo aprecio y me da algo nuevo para mirar. Pero es posible obtener su ejemplo de ... var groups = people.GroupBy (p => new {p.Age, p.Sex}); en una línea de código donde la cláusula group by (p.Age, p.Sex) puede ser sustituida por una cadena variable creada previamente que podría ser cualquier combinación de edad y/o sexo. Vengo de un fondo de FoxPro/SQL donde puedes construir dinámicamente tu consulta usando la concatenación de cadenas. De nuevo, aprecio tu ayuda. – FordPrefect141

+0

@ FordPerfect141 - Con LINQ, no puede simplemente concatenar cadenas, porque LINQ necesita ser fuertemente tipado. Puede lograr algo similar creando dinámicamente dicha expresión. – Venemo

+0

Ah-ha. Entonces, en su ejemplo, si el usuario deseaba agruparse a veces por sexo y edad, y algunas veces solo por edad, ¿cómo lo haría sin tener que codificar realmente la cláusula group by? Me disculpo nuevamente, esto es nuevo para mí. Muchas gracias de nuevo. – FordPrefect141

0

GroupBy (groupByName + "" + groupByDirection, nueva {})

por lo que podría pasar en groupByName y groupByDirection, cuando se está pasando a través, se puede ver algo como

GroupBy ("Apellido desc", nueva {})

o

GroupBy ("ASC Nombre", nuevos {})

Cuestiones relacionadas