2009-09-29 2 views
11

У меня есть таблица данных, и я хочу выполнить группу, не чувствительную к регистру, над столбцом таблицы данных (например, Column1 строки типа). Я заметил, что обычно LINQ to DataSet выполняет сравнение, чувствительное к регистру. Например, если Column1 имеет два строковых значения «Тест» и «Тест», после применения group by он возвращает две отдельные строки со значениями «Тест» и «Тест» вместо одного.LINQ to DataSet нечувствительная к регистру группа по

Этот запрос:

var countGroupQuery = from table in dataTable.AsEnumerable() 
         group table by table.Field<string>(Column1) into groupedTable 
         select new 
         { 
          value = groupedTable.Key, 
          count = groupedTable.Count() 
         }; 

Есть ли способ, чтобы выполнить без учета регистра group by так, что в приведенном выше примере я получаю только одну строку с одним значением (или «Test» или «тест») ? ToUpper или ToLower бы на самом деле изменить значения либо в верхнем или нижнем регистре, вместо того, чтобы использовать по крайней мере, один из входных значений, так что я не хочу использовать это:

group table by table.Field<string>(Column1).ToUpper() into groupedTable 
+1

Ваши последние правки [неприемлемое] (http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts) и, учитывая возраст сообщений, к которым вы их применяете, вероятный спам. Пожалуйста, воздержитесь. –

ответ

22

Вы не можете сделать это из выражения запроса, но вы можете сделать это с помощью точечной нотации:

var query = dataTable.AsEnumerable() 
        .GroupBy(x => table.Field<string>(Column1), 
           StringComparer.InvariantCultureIgnoreCase) 
        .Select(groupedTable => new 
          { 
           value = groupedTable.Key, 
           count = groupedTable.Count() 
          }); 

Вы можете даже использовать более сложную перегрузку GroupBy сделать это в одном вызове:

var query = dataTable.AsEnumerable() 
        .GroupBy(x => table.Field<string>(Column1), 
           (key, group) => { value = key, 
               count = group.Count() }, 
           StringComparer.InvariantCultureIgnoreCase)); 

Очевидно, что использование инвариантной культуры - вы также можете использовать текущую культуру или порядковые правила.

+1

Thanx для ответа. это то, что я ищу !!! Кстати, если я хочу применить группу более чем к одному столбцу (Column1 и Column2), то как должен выглядеть этот запрос? – Anoop

+0

@Anoop: Группировка более чем одним столбцом * и * делает это без учета регистра, будет сложным. Вероятно, вам лучше всего создать настраиваемый тип, содержащий интересующие вас столбцы, и переопределить Equals. –

+0

Jon! Не могли бы вы объяснить это более детально? – Anoop

3

Это MSDN article имеет некоторую информацию о наборах данных и чувствительность к регистру ..

Вы можете контролировать чувствительность к регистру фильтрации, поиска и сортировки установкой CaseSensitive свойство набора данных.

+0

В моем случае DataTable не зависит от Dataset, поэтому для чувствительного к регистру свойства установлено значение false. Я думаю, что Linq не ссылается на это свойство. Это для операций, открытых классом Dataset/Datatable. – Anoop

+0

DataTable также обладает этим свойством. Но, честно говоря, я не использовал LINQ для взаимодействия с наборами данных/таблицами, поэтому я не могу сказать, действительно ли это будет иметь эффект. –

+0

Это не работает для меня. Вы пытались использовать LINQ? – Bryan

0
var query = dt.AsEnumerable() 
       .GroupBy(r => r.Field<string>("Mes")) 
       .Select(g => new { Mes = g.Key, 
           Tns = g.Sum(s => Convert.ToDecimal(s.Field<string>("Tns"))) }) 
       .OrderBy(g => g.Mes.First()) 
       .Where(g => g.Mes == ddlMes.SelectedValue.ToString());