2011-01-12 3 views
1

나는 쿼리의 최대 값을 기반으로 Linq 쿼리 결과에 열을 추가하는 방법을 알아 내려고하고 있습니다. 본질적으로, 각 레코드에 대해 동일한 값을 갖는 최대 값 레코드를 포함하는 DataRow의 EnumerableRowCollection을 만들고 싶습니다. 내가 도움을 필요로하는 곳에Linq 쿼리 : 쿼리 결과에 열 추가

다음
DataTable dt = new DataTable(); 
dt = myDataSet.myDataTable; 

EnumerableRowCollection<DataRow> qrySelectRecords = 
      (from d in dt.AsEnumerable() 
      where d.Field<DateTime>("readingDate") >= startDate && g.Field<DateTime>("readingDate") <= endDate 
      select d); 

가있다 : 내가 백 레코드가 쿼리를 통해 반환해야한다면, 나는 다음 다음 필드 중 하나의 최대 값을 계산 원래 쿼리 테이블에 그 최대 값을 추가하려면 :

double maxValue = qrySelectRecords.Field<double>("field1").Max(); 

foreach (DataRow dr in qrySelectRecords) 
{ 
qrySelectRecords.Column.Append(maxValue) 
} 

답변

2

첫 번째 점 : new DataTable()은 중복입니다. 바로 다음 라인에서 참조를 덮어 쓰기 때문에 절대로 사용하지 않는 값 비싼 객체를 인스턴스화하는 것입니다. 초기화를 제거한 다음 선언과 실제 할당을 한 행에 결합하는 것을 고려해야합니다.

실제 질문으로 가기. DataRows에는 열을 직접 추가 할 수 없습니다. 해당 행을 포함하는 전체 DataTable에 열을 추가해야합니다. 완료되면 값을 설정하십시오. SQL과 같은 외부 쿼리 언어로 변환 된 작업이 필요하지 않는 한 모나드 확장 메서드를 사용하여이 작업을 인라인 할 수 있습니다.

DataTable dt = myDataSet.myDataTable; 
dt.Columns.Add("MaxField1"); 

EnumerableRowCollection<DataRow> qrySelectRecords = 
      (from d in dt.Rows().AsEnumerable().OfType<DataRow>() 
      where d.Field<DateTime>("readingDate") >= startDate 
       && d.Field<DateTime>("readingDate") <= endDate 
      let m = dt.AsEnumerable().Max(dr=>dr.Field<double>("field1")) 
      select d.WithColumnSet("MaxField1", m)); 

... 

public static DataRow WithColumnSet(this DataRow input, string columnName, object value) 
{ 
    input[columnName] = value; 
    return input; 
}