2010-10-27 40 views
4

我發現了幾篇文章,詳細介紹瞭如何根據外鍵執行加權平均,但是我還沒有找到解決方案來處理我的情況。這是它:C#Linq加權平均值基於日期

我有兩個表,表A和表B多對多表鏈接它們;沒有什麼複雜的:

TableA 
{ 
    A_ID, 
    Other stuff 
} 

TableB 
{ 
    B_ID, 
    Date 
    Other stuff 
} 

LinkAtoB 
{ 
    A_ID, 
    B_ID 
} 

現在來了數學部分。我或多或少地從表A試圖重結果根據最近協會在表B.數量

所以,如果表A有4個協會表日期如下:

{10/23/2010, //3 days ago 
10/19/2010, //5 days ago 
10/18/2010, //6 days ago 
9/13/2010} //40ish days ago 

因此,這裏是如何我想對他們進行排名:

我想提供天近因門檻,我會佔用7天爲例:

因此,使用上面的數據我會分配以下值:

{10/23/2010, //7-3 = 4 
10/19/2010, //7-5 = 2 
10/18/2010, //7-6 = 1 
9/13/2010} //40ish days ago 

因此,該特定TableA條目的加權平均值爲7/3 = 2.33333。

這或多或少是我到目前爲止有:

var k = from a in TableA 
     group a by a.Select(x=>x.LinkAtoB.TableB) 
        .Where(x=>x.Date.CompareTo(DateTime.Now.AddDays(-7)) >= 0) 
        into g 
     select g.Sum(x => DateTime.Now.Subtract(x.Date).Days)/
     g.Sum(x => x.Length); 

我想我接近,但我知道我有組部分是錯誤的。我認爲其他的東西應該工作。如何修復我的代碼以完成我想要的功能?

回答

4

在這裏,你去! :)

var k = (from b in TableB 
     join bb in LinkAtoB on b.B_ID equals bb.B_ID into b_join 
     from ab in b_join.DefaultIfEmpty() 
     where b.B_DATE.CompareTo(DateTime.Now.AddDays(-7)) > 0 
     select new {ab.A_ID, DaysAgo = (DateTime.Now - b.B_DATE).Days} into xx 
     group xx by xx.A_ID into yy 
     select new {yy.Key, Weighted = yy.Sum(x=> 7 - x.DaysAgo)/yy.Count()} into zz 
     join a in TableA on zz.Key equals a.A_ID 
     select new {a.A_ID, a.A_Other_Stuff, zz.Weighted}).ToList(); 
+0

GOLDEN!除了一個小編輯外,這完全適用。 .Value在第五行不是必需的。除了那種流暢的航行。 DefaultIfEmpty()部分是殺了我的東西。謝謝。 – Shawn 2010-10-27 08:56:33

+0

對不起,我正在測試一個空的日期。現在刪除。很高興它的作品:) – JumpingJezza 2010-10-27 08:58:46