2010-12-13 14 views
0

これは、この問題の一部を解決し、私は尋ねた別の質問へのルートを持っている - 今、私は次のように全体のロジックを記述しようとしていますこれを1つのlinqクエリに書き込みますか?

Convert this code to LINQ?

-

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

基本的に、オリジナルのデータテーブルには、Divisionを含むさまざまな情報を含む一連の行があります。私は、すべての部門が新しいラインに現れる単一の文字列を作成したいと考えています。そして、その部門のロール番号はコンマ区切りで表示されます。次の行を次の行に区切るなど。 (ここではセクションとディビジョンは相互運用可能な用語です)。

最初のクエリの結果をループするのではなく、1つのlinqクエリでこれを書くにはどのような方法もありますか?

EDIT:

データ(フィルタ条件で使用されている他の列に言及していない)

Roll_no Section.. other cols 

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

これは、出力がどのように見えるかである - (ロールが無いだけ部門内で一意です、しかし、それはどのような方法でのロジックに影響を与えるべきではない)

A 
001 002 003 
B 
001 004 006 

文字列がそのままの形式であるとき、これは 'A \ rを\ N001 002 003 \ rを\ nBは\ rを\ N001 004 006' のようになります。

注:上記のコードは動作します。私はもっ​​と良いアプローチを探しています。

+0

希望する出力の例を表示するために質問を更新できますか? – Steven

+0

質問データをサンプルデータと期待通りの出力である –

答えて

3

実装する必要がある要件は2つあり、それらを1つのものにマージしようとするべきではありません。あなたは1.結果をグループ化したい、そして2.プレゼンテーションの具体的なニーズを持っている。

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

またあなたのためのプレゼンテーションの一部をして1つのクエリを記述することが可能であるが、このクエリは非常に厄介と読めなくなる:ここで

は、あなたがこれを行うことができる方法です。

+0

+1に更新しましたが、さらに一歩前進させ、より多くの機能を抽出してさらに読みやすくしました。 –

+0

いくつかの小さなエラーがあります - group.Selectの代わりにg.Select ...を選択してください。まだ+1(まだ適切にクエリをチェックしていません) –

+0

もう1つの小さなエラー - グループはロール・ナンバーではありません。 –

関連する問題