C# LINQ数据表选择不同的行
我试图得到每个重复行的总和不同的行C# LINQ数据表选择不同的行,c#,linq,C#,Linq,我试图得到每个重复行的总和不同的行 DataTable newItems = new DataTable(); newItems.Columns.Add("Qty"); newItems.Columns.Add("BarcodeNumber"); newItems.Columns.Add("DisplayName"); newItems.Columns.Add("UnitPrice"); newItems.Columns.Add("TotalPrice"); newItems.Rows.Ad
DataTable newItems = new DataTable();
newItems.Columns.Add("Qty");
newItems.Columns.Add("BarcodeNumber");
newItems.Columns.Add("DisplayName");
newItems.Columns.Add("UnitPrice");
newItems.Columns.Add("TotalPrice");
newItems.Rows.Add(1, "URT29384", "Wallet", 88.8, 88.8);
newItems.Rows.Add(1, "URT29233", "Mouse", 4.44, 4.44);
newItems.Rows.Add(1, "URT29756", "Flash Drive", 1.47, 1.47);
newItems.Rows.Add(1, "URT29323", "Spoon", 99.95, 99.95);
newItems.Rows.Add(1, "URT29384", "Wallet", 88.8, 88.8);
newItems.Rows.Add(1, "URT29384", "Wallet", 88.8, 88.8);
我希望结果是
3 URT29384 Wallet 266.4 266.4
1 URT29233 Mouse 4.44 4.44
1 URT29756 Flash Drive 1.47 1.47
1 URT29323 Spoon 99.95 99.95
这可以使用LINQ吗?帮个小忙。。TYIA是的,您可以使用
可枚举。GroupBy
:
var result = newItems.AsEnumerable()
.GroupBy(r => r.Field<String>("BarcodeNumber"))
.Select(g => new {
Qty = g.Count(),
BarcodeNumber = g.Key,
DisplayName = g.First().Field<String>("DisplayName"),
UnitPrice = g.Sum(r => r.Field<double>("UnitPrice")),
TotalPrice = g.Sum(r => r.Field<double>("TotalPrice")),
})
.OrderByDescending(x => x.Qty);
您需要使用System.Linq添加代码>是的,这是可能的
var foo = newItems.AsEnumerable()
.GroupBy(item => item.Field<string>(newItems.Columns["BarcodeNumber"]));
DataTable newTable = new DataTable();
newTable.Columns.Add("Qty");
newTable.Columns.Add("BarcodeNumber");
newTable.Columns.Add("DisplayName");
newTable.Columns.Add("UnitPrice");
newTable.Columns.Add("TotalPrice");
foreach (var item in foo)
{
newTable.Rows.Add(
item.Count(),
item.Key,
item.First().Field<string>(newItems.Columns["DisplayName"]),
item.Sum(row => decimal.Parse(row.Field<string>(newItems.Columns["UnitPrice"]))),
item.Sum(row => decimal.Parse(row.Field<string>(newItems.Columns["TotalPrice"]))));
}
var foo=newItems.AsEnumerable()
.GroupBy(item=>item.Field(newItems.Columns[“条形码编号]));
DataTable newTable=新DataTable();
新增表格。列。添加(“数量”);
newTable.Columns.Add(“条码号”);
newTable.Columns.Add(“DisplayName”);
新增表格。列。添加(“单价”);
新增表格。列。添加(“总价”);
foreach(foo中的变量项)
{
newTable.Rows.Add(
item.Count(),
项目.关键,
item.First().Field(newItems.Columns[“DisplayName”]),
item.Sum(row=>decimal.Parse(row.Field(newItems.Columns[“单价”])),
item.Sum(row=>decimal.Parse(row.Field(newItems.Columns[“TotalPrice”]));
}
私有静态数据表GetUniqueEntries(数据表dt)
{
变量查询=(
从dt.AsEnumerable()中的行开始
选择row.Field(“用户名”).Distinct();//任何列
DataTable dtDistinctNames=新DataTable();
添加(“用户名”,typeof(字符串));
//必须返回一个datatable,从而循环遍历条目
foreach(查询中的字符串项)
{
DataRow newRow=dtDistinctNames.newRow();
newRow[“用户名”]=项目;
dtDistinctNames.Rows.Add(newRow);
}
返回dtDistinctNames;
}
这是否可以使用LINQ
。是的。只是一个离题建议:价格应该存储为System.Decimal
。看,有没有可能将结果转换成数据表?啊,在那里。。无需转换为datatable。将其放入datatable的awnser。如果您有数据库层,处理此问题将更加有效和容易,特别是当您需要大量数据或记录时。@VincentDagpin,是的,可以将其“转换”为datatable:datatable dt=new datatable(); dt=linqquery.CopyToDataTable();
var foo = newItems.AsEnumerable()
.GroupBy(item => item.Field<string>(newItems.Columns["BarcodeNumber"]));
DataTable newTable = new DataTable();
newTable.Columns.Add("Qty");
newTable.Columns.Add("BarcodeNumber");
newTable.Columns.Add("DisplayName");
newTable.Columns.Add("UnitPrice");
newTable.Columns.Add("TotalPrice");
foreach (var item in foo)
{
newTable.Rows.Add(
item.Count(),
item.Key,
item.First().Field<string>(newItems.Columns["DisplayName"]),
item.Sum(row => decimal.Parse(row.Field<string>(newItems.Columns["UnitPrice"]))),
item.Sum(row => decimal.Parse(row.Field<string>(newItems.Columns["TotalPrice"]))));
}
private static DataTable GetUniqueEntries(DataTable dt)
{
var query = (
from row in dt.AsEnumerable()
select row.Field<string>("UserName")).Distinct(); //any column <UserName>
DataTable dtDistinctNames = new DataTable();
dtDistinctNames.Columns.Add("UserName", typeof(string));
//have to return a datatable, thus loop through entries
foreach (string item in query)
{
DataRow newRow = dtDistinctNames.NewRow();
newRow["UserName"] = item;
dtDistinctNames.Rows.Add(newRow);
}
return dtDistinctNames;
}