雖然您沒有指定它,但顯然copyFrom是實現IEnumerable的DataTable類的對象。根據MSDN System.Data.DataTable該類不會實現它。如果您使用的類,你需要財產行,返回實現IEnumerable行的集合:
IEnumerable<DataRow> rows = copyFrom.Rows.Cast<DataRow>()
但如果你使用一個不同的DataTable類,你可能會做一些類似它轉換爲一個序列的東西的DataRow。
System.Data.DataRow類的對象具有用於訪問行中列的項屬性。在你的情況下,列名是oid,idate和amount。
爲了您的copyfrom轉換成你想要做的處理項目的順序是:
var itemsToProcess = copyFrom.Rows.Cast<DataRow>()
.Select(row => new
{
Oid = row["oid"],
Date = (DateTime)row["idate"],
Amount = (decimal)row["amount"],
});
我不知道,但我認爲列IDATE包含日期和金額欄包含一些價值。如果您的列包含其他類型,請隨意使用其他類型。
如果列包含字符串,並將其轉換爲使用解析正確的項目:
var itemsToProcess = copyFrom.Rows.Cast<DataRow>()
.Select(row => new
{
Id = (string)row["oid"],
Date = DateTime.Parse((string) row["idate"]),
Amount = Decimal.Parse (string) row["amount"]),
});
如果你不熟悉的lambda表達式。它幫了我很多,如下所示來閱讀:
itemsToProcess是項目的集合,從 數據行,其中從這個集合中的每一行,我們創建了一個新 對象具有三個屬性的集合採取:身份證= ...;數據= ...;金額= ...
見
現在我們有一個順序,我們可以比較日期和總結的數額。
你想要什麼,是將這個序列中的所有項目分組到具有相同ID和日期的組中。因此,您需要一個ID = 00045和日期= 02/13/2011的組,以及ID = 00045和日期= 2011年2月14日的組。
爲此您使用Enumerable.GroupBy。作爲選擇器(=共用一組中的所有項目)您使用Id和日期的組合:
var groups = itemsToProcess.GroupBy(item => new
{Id = item.Id, Data = item.Data});
現在您有組。
- 每個組都有一個屬性Key,它具有兩個屬性:Id和Data。
- 每組是從itemsToProcess藏品序列(所以它是一個「itemToprocess」與ID /數據/ Value屬性)
- 在一個組中的所有項目都使用相同ID和相同的數據。
所以你所要做的就是將每個組中的序列中的所有元素求和。
var resultSequence = groups.Select(groupItem => new
{
Id = groupItem.Key.Id
Date = groupItem.Key.Date,
Sum = groupItem.Sum(itemToProcess => itemToProcess.Value,
}
所以把他們放在一起爲一個語句:
var resultSequence = copyFrom.Rows.Cast<DataRow>()
.Select(row => new
{
Id = (string)row["oid"],
Date = DateTime.Parse((string) row["idate"]),
Amount = Decimal.Parse (string) row["amount"]),
})
.GroupBy (itemToProcess => new
{
Id = item.Id,
Data = item.Data
});
.Select(groupItem => new
{
Id = groupItem.Key.Id
Date = groupItem.Key.Date,
Sum = groupItem.Sum(itemToProcess => itemToProcess.Value,
});
謝謝,這是我需要什麼。所以,如果我想通過oid訂購它,那麼我會在選擇新品之前做一個訂單。 編輯:對不起,沒有意識到它是迷你Markdown。 –
一個簡單的方法可以做到這一點:'result = result.OrderBy(e => new {e.oid,e.idate});' – octavioccl