2010-12-13 28 views
0

Cela a sa racine dans une autre question que je posais, qui a résolu une partie de ce problème -Ecrivez ceci dans une requête linq?

Convert this code to LINQ?

Maintenant, je suis en train d'écrire toute la logique de la manière suivante -

var divisions = (
    from DataRow row in results.Rows 
    let section = row["SECTION"].ToString() 
    orderby section ascending 
    select section).Distinct(); 

string result = String.Empty; 

foreach (string div in divisions) 
{ 
    result = String.Concat(result, div, Environment.NewLine); 

    var query = 
     from DataRow row in results.Rows 
     let remarks = row["REMARKS"].ToString() 
     let exam = row["EXAM_NAME"].ToString() 
     let rollno = row["ROLL_NO"].ToString() 
     let section = row["SECTION"].ToString() 
     where (remarks == "Passes" || remarks == "Promoted") && 
      exam == "TOTAL" && section == div 
     orderby rollno 
     select rollno; 

    result = String.Concat(result,string.Join(" ", query.ToArray()), 
     Environment.NewLine);    
} 

Fondamentalement, le datatable original a un tas de lignes avec diverses informations, y compris la division. Je veux créer une chaîne unique, pour laquelle chaque division apparaît sur une nouvelle ligne, et en dessous, les numéros de rôle pour cette division sont affichés de manière séparée par des virgules. Prochaine division sur la ligne suivante, et ainsi de suite. (ici Section et division sont des termes interopérables).

Existe-t-il une manière élégante d'écrire ceci avec une requête linq, au lieu d'avoir à parcourir les résultats de la première requête?

EDIT:

Data (pas mentionner les autres colonnes qui sont utilisées dans des conditions de filtre)

Roll_no Section.. other cols 

001  A 
002  A 
001  B 
003  A 
004  B 
006  B 

C'est ce que la sortie ressemblera - (rouleau est non seulement unique au sein d'une division, mais cela ne devrait pas affecter la logique de quelque manière que)

A 
001 002 003 
B 
001 004 006 

Ce sera comme 'A \ r \ n001 002 003 \ r \ nB \ r \ n001 004 006' lorsque la chaîne est en format brut.

Remarque, le code ci-dessus fonctionne. Je cherche juste une meilleure approche.

+0

Pouvez-vous mettre à jour votre question pour montrer un exemple de la sortie désirée? – Steven

+0

J'ai mis à jour la question avec les données de l'échantillon et la sortie attendue –

Répondre

3

Vous devez avoir implémenté deux exigences distinctes et vous ne devez pas essayer de les fusionner en une seule chose. Vous 1. voulez grouper les résultats et 2. avez des besoins spécifiques pour la présentation.

Voici comment vous pouvez faire ceci:

var query = 
    from DataRow row in results.Rows 
    // here the query stuff you already had 
    select new { rollno, section, exam, remarks }; 

// 1. Grouping 
var groups = 
    from item in query 
    group item by item.section into g 
    select new 
    { 
     Section = g.Key, 
     Rollnos = g.Select(i => i.rollno).ToArray(), 
    }; 

// 2. Presentation 
foreach (var group in groups) 
{ 
    Console.WriteLine(group.Section); 
    Console.WriteLine(string.Join(" ", group.Rollno)); 
} 

Il est possible d'écrire une seule requête qui fait aussi partie de la présentation pour vous, mais cette requête deviendrait très méchant et illisible.

+0

+1 pour une bonne réponse, mais je voudrais même aller un peu plus loin et extraire ou plus de fonctions pour le rendre encore plus lisible. –

+0

il y a quelques petites erreurs - comme il devrait être g.Select ... au lieu de group.Select .. encore +1 (encore à vérifier la requête correctement) –

+0

une petite erreur plus - groupe par devrait être avec la section pas rouler non . –