Pregunta

Esta es una pregunta más directa derivada de un pregunta más general que tuve anteriormente ahora que he pasado más tiempo buscando en ADO.NET

Quiero tomar una tabla de datos ADO.NET y realizar el equivalente de una consulta SQL SELECT con funciones agregadas (como SUM) en algunas columnas y GROUP BY configurado para las columnas restantes. Luego quiero tomar el resultado y mostrarlo en un DataGrid.

Entiendo que puedo crear un DataView de una DataTable que contenga criterios de filtro y funciones agregadas. Pero la página MSDN en Expresiones dice que

" Si usa una sola tabla para crear un agregado, no habría funcionalidad de agrupación. En cambio, todas las filas mostrarían el mismo valor en la columna. & Quot;

¿Cómo obtengo la funcionalidad de tipo GROUP BY de ADO.NET sin escribir mi tabla en una base de datos separada y ejecutar una consulta allí? ¿Hay alguna forma de hacerlo creando o usando una segunda tabla?

¿Fue útil?

Solución

Puede usar la capacidad de agrupación de LINQ para lograr esto. Además, puede vincular un DataGrid a una consulta LINQ, pero los datos serán de solo lectura.

Una búsqueda web para agrupar LINQ debería llevarlo a donde va.

Otros consejos

Una forma de evitarlo es convertir el resultado de su consulta linq en una DataTable usando la reflexión. Aquí hay un ejemplo. Una vez que tenga una DataTable, tendrá groupby completo, paginación, etc ...

    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);
    }

Aquí se explica cómo hacerlo utilizando .NET 3.xy superior (LINQ):

http: //codecorner.galanter .net / 2009/12/17 / grouping-ado-net-datatable-using-linq /

Y así es como se hace usando .NET 2.0 y versiones posteriores (ADP.NET estándar)

http: // codecorner .galanter.net / 2009/04/20 / group-by-and-agreggates-in-net-datatable /

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top