[英]Sharepoint 2010: How to access analytics data to create summary roll-up web parts?
[英]linq joining, grouping, with parent roll-up
說我有這種格式的數據表:
id | key1 | key2 | data1 | data2 | parentID
10 | AA | one | 10.3 | 0.3 | -1
10 | AA | two | 20.1 | 16.2 | -1
10 | BB | one | -5.9 | 30.1 | -1
20 | AA | one | 403.1 | -20.4 | 10
30 | AA | one | 121.5 | 210.3 | -1
第二個DataTable像這樣:
id | data
10 | 5500
20 | -3000
30 | 500
我想做的是在“ id”級別聚合數據,將第二個表的“ data”字段添加到第一個表的凈“ data1”中,而“ data2”只是自己匯總。 我想出了如何做到這一點,但我遇到的問題是:我希望將任何帶有“ parentID”!= -1的數據添加到其父項中。 因此上述數據的輸出應為
id | data1 | data2
10 | 2927.6 | 26.2
30 | 621.5 | 210.3
有沒有一種有效的方法可以做到這一點?
編輯:代碼示例
DataTable dt1 = new DataTable();
dt1.Columns.Add("id", typeof(int));
dt1.Columns.Add("key1", typeof(string));
dt1.Columns.Add("key2", typeof(string));
dt1.Columns.Add("data1", typeof(double));
dt1.Columns.Add("data2", typeof(double));
dt1.Columns.Add("parentID", typeof(int));
DataTable dt2 = new DataTable();
dt2.Columns.Add("id", typeof(int));
dt2.Columns.Add("data", typeof(double));
dt1.Rows.Add(new object[] { 10, "AA", "one", 10.3, 0.3, -1 });
dt1.Rows.Add(new object[] { 10, "AA", "two", 20.1, 16.2, -1 });
dt1.Rows.Add(new object[] { 10, "BB", "one", -5.9, 30.1, -1 });
dt1.Rows.Add(new object[] { 20, "AA", "one", 403.1, -20.4, 10 });
dt1.Rows.Add(new object[] { 30, "AA", "one", 121.5, 210.3, -1 });
dt2.Rows.Add(new object[] { 10, 5500 });
dt2.Rows.Add(new object[] { 20, -3000 });
dt2.Rows.Add(new object[] { 30, 500 });
var groups = dt1.AsEnumerable()
.GroupBy(e => e["id"])
.Select(e => new
{
id = e.Key,
net_data1 = e.Sum(w => (double)w["data1"]),
net_data2 = e.Sum(w => (double)w["data2"])
})
.GroupJoin(dt2.AsEnumerable(), e1 => e1.id, e2 => e2["id"],
(a1, a2) => new
{
id = a1.id,
net_data1 = a1.net_data1 + a2.Sum(w => (double)w["data"]),
net_data2 = a1.net_data2
});
不幸的是,SQL(以及擴展名LINQ)並不適合於遞歸。 parentID
列可以深入多個層次嗎? 像這樣:
ID Parent
------------------
10 -1
20 10
30 10
40 20
如果要追溯從ID 40到ID 10的步驟,則應該放棄SQL / LINQ方法,而只需用代碼即可。
聽起來好像很好地使用了組聯接。 像這樣的事情可能會起作用(盡管它完全未經測試):
var items = from parent in context.dataTable
join child in context.dataTable on parent.id equals child.parentID into children
where parent.parentID == -1
select new { id = parent.id,
data1 = (parent.data1 + children.Sum(c => c.data1)),
data2 = (parent.data2 + children.Sum(c => c.data2)) };
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.