DataTable中一列的总和取决于其他列ASP.NET中的值

时间:2014-07-15 07:33:50

标签: c# asp.net datatable sum

我试图将一列合并,但我需要根据其他列进行操作。 这是故事:我在第一列(A +,A-,B +,B-,O +,O-,AB +,AB-)中有8个血型组合的值和捐赠量第二栏的血。 我想做的是为每种血型做出总和。

这是一个当前数据表: enter image description here

所以我需要获得整数值:根据该图片,在某些abMinus中为850,在bPlus中为400,在oMinus中为500,在oPlus和aMinus变量中为0。

我的数据表的数据源是SQL数据库,我使用此查询来填充表格:

protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MainConnectionString"].ConnectionString);

                connection.Open();
                SqlDataAdapter sda = new SqlDataAdapter();
                sda.SelectCommand = new SqlCommand("select bloodGroup, bloodAmount from Donacije ", connection);
                SqlCommandBuilder dcb = new SqlCommandBuilder(sda);
                DataTable bloodBalanceTable = new DataTable();
                sda.Fill(bloodBalanceTable);
                connection.Close();
            }
            catch (Exception ex)
            {
                Response.Write("Error: " + ex.Message);
            }
        }

从名为' Donacije'的数据库表中我得到bloodGroup和bloodAmount的值。

有人可能会建议最好和最简单的方法是什么? 在此先感谢:)

2 个答案:

答案 0 :(得分:1)

您可以使用GroupBy()Sum()的LINQ表达式。但是,了解表格的数据源以提供确切的代码来解决此问题是必要的。

现在您已经更新了问题以显示表格DataSource是DataTable,我将向您展示具有一些解释的确切代码。

使用简单的" LINQ to Objects",需要using System.Linq,你可以这样做:

 List<GroupQty> qtyByGroups = GroupQty.SampleDataTable
  .Select() // This returns an array of DataRow
  .GroupBy(dr => dr["BloodGroup"].ToString()) // This groups by BloodGroup column
  .Select(g => new GroupQty  // Use anonymous type, or the GroupQty class below
  {
    BloodGroup = g.Key, // The key by which you ordered: BloodGroup
    Qty = g.Sum(dr => (int) dr["Qty"])  // Sum of the datarows in that group
  })
  .ToList();

此解决方案除LINQ外不需要任何其他内容,您可以使用您已经习惯的语法。

您可以定义这样的类来获取类型化结果:

public class GroupQty
{
    public string BloodGroup { get; set; }
    public int Qty { get; set; }
}

这允许您将结果用作表的数据源,或使用键入的结果。

Tim Schmelter的解决方案需要在项目中添加对System.Data.DataSetExtensions程序集的引用。如果您没有添加此引用,则无法使用。此解决方案不需要任何其他参考,并且语法是您每天使用的(除了LINQ到对象部分)。

为了学习LINQ,我建议您看一下:101 LINQ Samples,它几​​乎可以显示LINQ所能做的一切。

答案 1 :(得分:1)

您可以使用Linq-To-DataSet:

var bloodGroupAmounts = bloodBalanceTable.AsEnumerable()
   .GroupBy(r => r.Field<string>("BloodGoup"))
   .Select(grp => new { BloodGroup = grp.Key, Amount = grp.Sum(r => Field<int>("BloodAmount")) });

这将选择具有两个属性的匿名类型。您还可以创建一个字典,其中组为键,每组的数量为值:

var bloodGroupAmounts = bloodBalanceTable.AsEnumerable()
   .GroupBy(r => r.Field<string>("BloodGoup"))
   .ToDictionary(grp => grp.Key, grp => grp.Sum(r => Field<int>("BloodAmount")));