2009-09-29 3 views
11

데이터 테이블이 있고 데이터 테이블의 열 (대/소문자를 구분하지 않습니다) (예 : Column1, 문자열 유형). 나는 LINQ to DataSet이 대소 문자를 구분하여 비교하는 것을 관찰했다. 예를 들어, Column1에 두 개의 문자열 값 "Test"와 "test"가있는 경우 group by을 적용한 후 값이 "Test"와 "test"인 두 개의 개별 행을 반환합니다.LINQ to DataSet 대/소문자 구분 그룹 by

쿼리는 다음

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

수행하는 임의의 방법이되는 경우를 구분하지 I 한 값 (중 "시험"또는 "테스트")의 한 행을 얻을 상기 예에서되도록 group by ? 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

대답은 고맙습니다. 이게 내가 찾고있는거야 !!! 그런데 두 개 이상의 열 (Column1 및 Column2)에서 group by을 적용하려면이 쿼리를 어떻게 표시해야합니까 ?? – Anoop

+0

@Anoop : 두 개 이상의 열로 그룹화 * 및 * 대/소문자를 구분하지 않는 방식은 까다 롭습니다. 관심있는 열이 포함 된 사용자 정의 유형을 작성하고 Equals를 대체하는 것이 가장 좋을 것입니다. –

+0

Jon! 좀 더 자세하게 설명해 주시겠습니까 ?? – Anoop

3

것은이 MSDN article 데이터 세트에 대한 몇 가지 정보를 가지고 및 사례 감도 ..

당신은 검색 및 데이터 세트의 CaseSensitive 속성을 설정하여 정렬, 필터링의 경우 감도 을 제어 할 수 있습니다.

당신은 쿼리 식에서이 작업을 수행 할 수 있지만,이 점 표기법으로 그것을 할 수
+0

제 경우에는 DataTable이 Dataset과 독립적이므로 대소 문자 구분 속성이 false로 설정됩니다. 나는 Linq가이 property를 참조하지 않는다고 생각한다. 이것은 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());