Funções agregadas no Ado.net com grupo por funcionalidade
-
06-07-2019 - |
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?
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/