2012-10-04 82 views
3

我试图与每个副本行LINQ数据表SELECT DISTINCT行

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

+0

'这是可能使用LINQ'。是啊。 –

+0

只是一个offtopic建议:价格应该存储为'System.Decimal'。请参阅http://stackoverflow.com/a/1165788/390819 – GolfWolf

回答

6

是的,你可以使用Enumerable.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); 

请注意,这不是一个DataTableIEnumerable<DataRow>但匿名类型与列。如果需要的话,您需要使用foreach循环将真实的DataRows添加到另一个DataTable。

foreach (var grp in result) 
    Console.WriteLine("Qty:{0} BarcodeNumber:{1} DisplayName:{2} UnitPrice:{3} TotalPrice:{4}" 
     , grp.Qty, grp.BarcodeNumber, grp.DisplayName, grp.UnitPrice, grp.TotalPrice); 

您需要添加using System.Linq;

+0

是否可以将结果转换为数据表? –

+0

啊..没有必要转换为数据表 –

+0

发表了一个awnser,把它放入一个数据表。 –

1

是有可能

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"])))); 
} 
+0

感谢您的回复 –

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