2009-04-16 11 views
10

È possibile scrivere un'istruzione LINQ con una clausola di gruppo condizionale? Qui è fondamentalmente quello che sto cercando di fare:Gruppo condizionale LINQ

bool someFlag = false; 

var result = from t in tableName 
    group t by new { (someFlag ? 0 : t.FieldA), t.FieldB } into g 
    select g; 

Quindi, fondamentalmente, se someflag è impostata su true, voglio gruppo solo da FieldB, ma se è falso che voglio gruppo da FieldA e FieldB.

+0

I campi A e B sono dello stesso tipo? Se è così, ciò può semplificare molto le cose. – Noldorin

+0

Suppongo inoltre che someFlag dipenda dall'elemento corrente? – Noldorin

+0

Sì, FieldA e FieldB sono entrambi numeri interi. E someFlag verrebbe passato come parametro al metodo. – MrDustpan

risposta

20

Collega che ha calcolato fuori per me:

bool someFlag = false; 
var result = from t in tableName 
    group t by new { FieldA = (someFlag ? 0 : t.FieldA), t.FieldB } into g 
    select g; 
+1

Puoi lasciare tutto dopo "}". Non è necessario selezionare esplicitamente gli articoli raggruppati. –

0

Nel caso in cui il vostro someFlag non è una variabile dipendente sull'elemento corrente del iteratore, allora penso che si potrebbe rendere il codice più leggibile scrivendo quanto segue

bool someFlag = false; 
var result = someFlag ? 
    (from t in tableName group t by t.FieldA into g select g) : 
    (from t in tableName group t by t.FieldB into g select g); 

Ammettiamo che è leggermente più lungo, ma a mio avviso il suo scopo è molto più evidente.

E per semplificare un po 'il codice che hai appena pubblicato:

bool someFlag = false; 
var result = from t in tableName 
    group t by (someFlag ? t.FieldA : t.FieldB) into g 
    select g; 

... o mi sto perdendo qualcosa qui?