基于日期的C#Linq加权平均值

时间:2010-10-27 03:58:13

标签: c# linq

我发现了几篇详细介绍如何根据外键执行加权平均的帖子,但我还没有找到解决我情况的解决方案。这是:

我有两个表,表A和表B多对多表链接它们;没什么复杂的:

TableA
{
     A_ID,
     Other stuff
}

TableB
{
     B_ID,
     Date
     Other stuff
}

LinkAtoB
{
     A_ID,
     B_ID
}

现在这里是数学部分。我或多或少试图根据表B中最近的关联数量来加权TableA的结果。

因此,如果TableA在表中有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);

我认为我很接近,但我知道我的小组部分错了。我认为其他的东西应该有效。如何修复代码以实现我想要的目标?

1 个答案:

答案 0 :(得分: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();