把它写成一个linq查询?

时间:2010-12-13 10:46:19

标签: c# 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。我想创建一个单独的字符串,每个分区出现在一个新行上,而在下面,该分区的roll nos以逗号分隔的方式显示。下一行的下一个分区,依此类推。 (这里的部门和部门是可互操作的术语)。

有没有一种优雅的方法可以用一个linq查询来编写它,而不必遍历第一个查询的结果?

编辑:

数据(未提及过滤条件中使用的其他列)

Roll_no Section.. other cols

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

这就是输出的样子 - (roll no在分区中是唯一的,但不应该以任何方式影响逻辑)

A
001 002 003
B
001 004 006

当字符串为原始格式时,这将类似于'A \ r \ n001 002 003 \ r \ nB \ r \ n001 004 006'。

注意,上面的代码有效。我只是在寻找更好的方法。

1 个答案:

答案 0 :(得分:3)

您希望实现两个单独的要求,并且不应尝试将它们合并为单个要素。您1.希望将结果分组为togetter 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));
}

可以编写一个也为您做部分演示的单个查询,但是这个查询会变得非常讨厌且难以理解。