Вопрос

Это более прямой вопрос, вытекающий из более раннего более общий вопрос, который у меня был раньше теперь, когда я трачу больше времени на изучение ADO.NET

Я хочу взять таблицу данных ADO.NET и выполнить эквивалент запроса SQL SELECT с агрегатными функциями (например, SUM) для некоторых столбцов, а для других столбцов задать значение GROUP BY. Затем я хочу взять результат и отобразить его в DataGrid.

Я понимаю, что могу создать DataView для DataTable, который содержит критерии фильтра и агрегатные функции. Но на странице MSDN с выражениями говорится, что

" Если вы используете одну таблицу для создания агрегата, функции группирования не будут. Вместо этого все строки будут отображать одно и то же значение в столбце. & Quot;

Как получить функциональность типа GROUP BY из ADO.NET, не записывая таблицу в отдельную базу данных и не выполняя там запрос? Есть ли способ сделать это, создав или используя вторую таблицу?

Это было полезно?

Решение

Для этого вы можете использовать возможность группировки LINQ. Кроме того, вы можете привязать DataGrid к запросу LINQ, но данные будут только для чтения.

Поиск в сети для группировки LINQ должен привести вас туда, куда вы идете.

Другие советы

Одним из способов решения этой проблемы является преобразование результата запроса linq в DataTable с использованием отражения. Вот пример. Если у вас есть DataTable, у вас будет полный групповой доступ, пейджинг и т. Д.

    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 / группирование-лукаво-нетто-DataTable-используя-LINQ /

И вот как это сделать, используя .NET 2.0 и ниже (стандарт ADP.NET)

http: // codecorner .galanter.net / 2009/04/20 / группа, побочные и-заполнители-в-нетто-DataTable /

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top