2010-05-24 11 views
6

Sono un programmatore da alcuni anni ma sono un
nuovo arrivato a LINQ e C# quindi perdonami se la mia domanda suona
particolarmente stupida.Come posso creare una query LINQ dinamica in C# con possibili clausole multiple per gruppo?

Spero che qualcuno possa indicarmi la direzione giusta
. Il mio compito è di creare un gruppo multiplo dinamico tramite query linq all'interno di uno script C# usando
un elenco generico come sorgente.

Per esempio, dire che ho un elenco contenente gli oggetti multipli con la seguente
struttura:

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

In poche parole voglio essere in grado di creare una query LINQ che
sommerà FieldNum1 e FieldNum2 raggruppati da uno, due o tutti e tre i campi FieldChar che verranno decisi al runtime
in base ai requisiti degli utenti e selezionando i campi FieldChar nella stessa query.

ho le dynamic.cs nel mio progetto, che include solo un metodo di estensione GroupByMany ma devo ammettere che non sono realmente sicuro come mettere questi da usare. Sono in grado di ottenere i risultati desiderati se utilizzo una query con un gruppo cablato per richieste ma non dinamicamente.

Ci scusiamo per qualsiasi nomenclatura errata, sono nuovo in questa lingua, ma qualsiasi consiglio sarebbe il benvenuto.

Molte grazie

Alex

risposta

1

Ecco la GroupBy esempio di base. Diciamo che abbiamo una classe semplice come questo:

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

    public int Age { get; set; } 

    public char Sex { get; set; } 
} 

Quindi, è possibile utilizzare GroupBy come questo:

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

Per quanto riguarda il raggruppamento con più proprietà, vedere questi:
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

Fondamentalmente, è la stessa sintassi con un tipo anonimo, ad esempio:

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

Si noti che potrebbe essere alla ricerca per l'utilizzo di molteplici OrderBy s:

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

noti inoltre che il risultato dell'ultima dichiarazione GroupBy e il risultato di questa dichiarazione OrderBy non è lo stesso.

+0

Molte grazie per la risposta. Lo apprezzo e mi dà qualcosa di nuovo da guardare. Ma è possibile ottenere il tuo esempio di ... var groups = people.GroupBy (p => new {p.Age, p.Sex}); in una riga di codice in cui la clausola group by (p.Age, p.Sex) può essere sostituita da una stringa variabile creata in precedenza che potrebbe essere una qualsiasi combinazione di età e/o sesso? Vengo da uno sfondo FoxPro/SQL in cui è possibile creare dinamicamente la query utilizzando la concatenazione di stringhe. Di nuovo apprezzo il tuo aiuto. – FordPrefect141

+0

@ FordPerfect141 - Con LINQ, non è possibile concatenare semplicemente stringhe, perché LINQ deve essere fortemente digitato. È possibile ottenere qualcosa di simile creando dinamicamente tale espressione. – Venemo

+0

Ah-ha. Quindi nel tuo esempio, se l'utente volesse raggruppare a volte per sesso ed età, e qualche volta solo per età, come andresti a farlo senza realmente codificare il gruppo in base alla clausola? Mi scuso di nuovo, questo è tutto nuovo per me. Molte grazie ancora. – FordPrefect141

0

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

Così si potrebbe passare groupByName e groupByDirection, quando si sta passando attraverso, si potrebbe vedere qualcosa di simile

GroupBy ("lastName disc", nuova {})

o

GroupBy ("Nome asc", nuove {})