使用LINQ获取特定列中具有相同值的表中的所有记录

时间:2011-04-04 23:43:07

标签: linq linq-to-objects

我试图获取表中列中具有相同值的所有行。我通过使用group by来实现它:

var groupedData = from row in Tab1Model.ExcelGridDataSource.AsEnumerable()
                                            group row by row.Field<string>("A");


        foreach (var group in groupedData)
        {
            if (group.Count() > 1)
            {
                                    //select from each group only the DataRows  
                                    //having a certain value in a second column
                foreach (var dataRow in group)
                {
                    multipleRowsList.Add(dataRow);
                }
            }
        }

我想避免调用foreach,只获得有计数的组&gt; 1然后再获取 具有特定值的第二列的DataRows。谢谢!

3 个答案:

答案 0 :(得分:1)

试试这个:

var query = from row in excelDataSource 
            group row by row.Field<string>("A") into g 
            select new { Value = g.Key, Rows = g };
var nonZeroRows= from q in query 
                       where q.Rows.Count() > 0 
                       select q.Rows;
// at this point you have an enumerable of enumerables of tablerows.
var list = nonZeroRows.Aggregate(Enumerable.Empty<TableRow>(), 
           (a, b) => a.Concat(b.Where(c => c.Something == true)); // your condition here

答案 1 :(得分:0)

谢谢Atanamir!这是最终的代码,只是想知道你是否有更好的方法。最终目标是标记两次输入的行之一。

var groupedData = from row in Tab1Model.ExcelGridDataSource.AsEnumerable()
                          group row by row.Field<string>("A")
                          into g
                          select new {Value = g.Key, Rows = g};
        var nonZeroesRows = from q in groupedData
                            where q.Rows.Count() > 1
                            select q.Rows;
        //at this point you have an enumerable of enumerables of tables rows
        var listRows = nonZeroesRows.Aggregate(Enumerable.Empty<DataRow>(),
                                               (a, b) => a.Concat(b.Where(c => c.Field<bool>("Omit Row") == false)));

        //grouped them again and get only the last row from the group wiht a count > 1 
        var doubleRows = from row in listRows
                         group row by row.Field<string>("A")
                         into g
                         where g.Count() > 1
                         select g.Last();

答案 2 :(得分:0)

或者更好:

            var groupedData = from row in Tab1Model.ExcelGridDataSource.AsEnumerable()
                          group row by row.Field<string>("A")
                          into g
                                            where g.Count() > 1
                          select new {/*Value = g.Key,*/ Rows = g};

        //at this point you have an enumerable of enumerables of tables rows
        var listRows = groupedData.Aggregate(Enumerable.Empty<DataRow>(),
                                               (a, b) => a.Concat(b.Rows.Where(c => c.Field<bool>("Omit Row") == false)));

        //grouped them again and get only the last row from the group wiht a count > 1 
        var doubleRows = from row in listRows
                         group row by row.Field<string>("A")
                         into g
                         where g.Count() > 1
                         select g.Last();