기능별로 그룹을 사용하여 ADO.NET의 집계 기능
-
06-07-2019 - |
문제
이것은 이전의 더 직접적인 질문입니다. 더 일반적인 질문 이제 Ado.net을 살펴 보는 데 더 많은 시간을 보냅니다
Ado.net DataTable을 가져 와서 일부 열에 집계 함수 (예 : 합)가있는 SQL Select 쿼리와 나머지 열에 대해 그룹을 설정하고 싶습니다. 그런 다음 결과를 가져 와서 Datagrid에 표시하고 싶습니다.
필터 기준 및 집계 함수가 포함 된 데이터 테이블의 데이터 뷰를 만들 수 있음을 이해합니다. 하지만 표현식에 대한 MSDN 페이지 그렇게 말해봐
"단일 테이블을 사용하여 집계를 만들면 그룹별 기능이 없습니다. 대신 모든 행이 열에 동일한 값을 표시합니다."
내 테이블을 별도의 데이터베이스에 작성하고 거기에서 쿼리를 실행하지 않고 Ado.net에서 유형의 기능을 얻을 수있는 그룹을 어떻게 얻습니까? 두 번째 테이블을 만들거나 사용하여 수행 할 수있는 방법이 있습니까?
해결책
LINQ의 그룹화 능력을 사용하여이를 달성 할 수 있습니다. 또한 Datagrid를 LINQ 쿼리에 바인딩 할 수 있지만 데이터는 읽습니다.
LINQ 그룹화에 대한 웹 검색은 어디로 가고 있는지를 가져야합니다.
다른 팁
주변의 한 가지 방법은 LINQ 쿼리 결과를 반사를 사용하여 데이터 가능으로 바꾸는 것입니다. 여기 예입니다. DataTable이 있으면 전체 Groupby, Pating 등이 있습니다 ...
private static System.Data.DataTable ObjectArrayToDataTable(object[] data)
{
System.Data.DataTable dt = new System.Data.DataTable();
// if data is empty, return an empty table
if (data.Length == 0) return dt;
Type t = data[0].GetType();
System.Reflection.PropertyInfo[] piList = t.GetProperties();
foreach (System.Reflection.PropertyInfo p in piList)
{
dt.Columns.Add(new System.Data.DataColumn(p.Name, p.PropertyType));
}
object[] row = new object[piList.Length];
foreach (object obj in data)
{
int i = 0;
foreach (System.Reflection.PropertyInfo pi in piList)
{
row[i++] = pi.GetValue(obj, null);
}
dt.Rows.Add(row);
}
return dt;
}
internal static DataTable GetAllStoredFileDetailsByUserID(int userID)
{
var db = GetDataContext();
object[] result;
try
{
result = (from files in db.Files
where files.OwnerUserID == userID && files.IsThumbnail == false
select new
{
FileID = files.FileID,
Name = files.Name,
DateCreated = files.DateCreated,
Size = files.Size,
FileHits = (from act in db.FileWebActivities where act.FileID == files.FileID select act).Count()
}).ToArray();
}
catch (Exception)
{
//omitted
}
return ObjectArrayToDataTable(result);
}
.NET 3.X 이상 (LINQ)을 사용하여 수행하는 방법은 다음과 같습니다.
http://codecorner.galanter.net/2009/12/17/grouping-ado-net-datatable-using-linq/
그리고 이것은 .NET 2.0 이하 (표준 ADP.NET)를 사용하여 수행하는 방법입니다.
http://codecorner.galanter.net/2009/04/20/group-by-and-aggregates-in-net-datatable/