문제

이것은 이전의 더 직접적인 질문입니다. 더 일반적인 질문 이제 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/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top