我试图将一列合并,但我需要根据其他列进行操作。 这是故事:我在第一列(A +,A-,B +,B-,O +,O-,AB +,AB-)中有8个血型组合的值和捐赠量第二栏的血。 我想做的是为每种血型做出总和。
这是一个当前数据表:
所以我需要获得整数值:根据该图片,在某些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的值。
有人可能会建议最好和最简单的方法是什么? 在此先感谢:)
答案 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")));