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;  
    }