Pergunta

Esta é uma pergunta mais direta decorrente de um anterior Pergunta mais geral que eu tinha antes Agora que passo mais tempo olhando para o ADO.NET

Quero pegar um ADO.NET DATATABLE e executar o equivalente a uma consulta SQL Select com funções agregadas (como SUM) em algumas colunas e grupo por conjunto para as colunas restantes. Eu então quero pegar o resultado e exibi -lo em um datagrid.

Entendo que posso criar um dataView de um datatable que contém critérios de filtro e funções agregadas. Mas o Página msdn em expressões diz isso

"Se você usar uma única tabela para criar um agregado, não haveria funcionalidade em grupo. Em vez disso, todas as linhas exibiriam o mesmo valor na coluna".

Como faço para obter a funcionalidade do grupo por tipo do ADO.NET sem escrever minha tabela em um banco de dados separado e executando uma consulta lá? Existe alguma maneira de fazer isso criando ou usando uma segunda tabela?

Foi útil?

Solução

Você pode usar a capacidade de agrupamento do LINQ para conseguir isso. Além disso, você pode vincular um datagrid a uma consulta LINQ, mas os dados serão apenas leitura.

Uma pesquisa na web pelo agrupamento LINQ deve levá -lo aonde você está indo.

Outras dicas

Uma maneira de contornar isso é transformar seu resultado de consulta LINQ em um datatable usando a reflexão. Aqui está um exemplo. Depois de ter um Datatable, você terá um grupo completo, paginação, 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);
    }

Veja como fazer isso usando .NET 3.x e acima (Linq):

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

E é assim que fazê -lo usando .NET 2.0 e abaixo (padrão adp.net)

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top