Использование LINQ для получения всех записей в таблице, имеющих одинаковое значение в определенном столбце - PullRequest
0 голосов
/ 05 апреля 2011

Я пытаюсь получить все строки таблицы, имеющие одинаковое значение в столбце.Я заработал, используя группу:

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, получить только группы с числом> 1, а затем ТОЛЬКО те DataRow, которые имеют второй столбец с определенным значением,Спасибо!

Ответы [ 3 ]

1 голос
/ 05 апреля 2011

попробуйте это:

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
0 голосов
/ 07 апреля 2011

Или, может быть, лучше:

            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();
0 голосов
/ 06 апреля 2011

Спасибо, Атанамир!Вот финальный код, просто подумайте, есть ли у вас лучшие способы сделать это.конечная цель этого - пометить одну из строк, которые вводятся дважды.

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();
...