带连接的linq查询返回不正确的值/关联

时间:2015-06-16 18:35:42

标签: c# linq

我有一个梦幻足球网站,在一个页面上我让用户选择最多5个玩家进行比较(对于这个例子,我使用了Peyton Manning,Aaron Rodgers和Andrew Luck)。我运行以下查询以返回这些玩家的所有逐周数据:

char

初看起来,一切看起来都很棒,每位玩家可获得16个结果。但是,我看得更近,我看到它只返回Peyton所有三名球员的统计数据! (现在,大多数玩家不会抱怨获得Peyton的统计数据,但这不是我想的那个......)

我的双重/三重检查,数据库中的一切都是正确的。以下sql运行完美:

     var weekStats = from p in db.Players
                            join t in db.Teams on p.teamAbbre equals t.teamAbbre
                            join w in db.WeekStats on p.playerId equals w.playerId 
                            where (p.playerId == player0 || p.playerId == player1 || p.playerId == player2 || p.playerId == player3 || p.playerId == player4)
                                && w.season == 2014
                            select new PlayerIndexViewModel
                            {
                                player = p,
                                team = t,
                                weekStat = w

                            };

注意:在这个例子中我们只选择了3个玩家,所以-1只是假人。

在做了一些搜索后,我读到了关于“导航”作为连接的替代方法并尝试了以下但得到了相同的结果:

    select p.*, t.*, w.* from Player p
    join Team t on t.teamAbbre = p.teamAbbre
    join WeekStat w on w.playerId = p.playerId
    where
    w.season = 2014
    and (p.playerId = 2501863 or p.playerId = 2506363 or p.playerId = 2533031 or p.playerId = -1 or p.playerId = -1)

我还添加了一行,我专门查看一个统计数据,看看发生了什么:

var weekStats2 = from w in db.WeekStats
                        where (w.playerId == player0 || w.playerId == player1 || w.playerId == player2 || w.playerId == player3 || w.playerId == player4)
                            && w.season == 2014
                        select new PlayerIndexViewModel
                        {
                            player = w.player,
                            team = w.player.Team,
                            weekStat = w

                        };

当我运行并逐步调试时,我发现statCat_5对于每个玩家都是正确的,但是weekStat中的值仍然与Peyton的统计数据重复。同样奇怪的是,Rodgers和Luck的正确一周缺失(意味着3名球员中的每一个都有不同的再见周,因此数据中缺少相关的一周)。

我想我的问题是:我疯了吗?我的LINQ出了什么问题导致了这种奇怪的现象?

-----------编辑 这是根据调试器运行的sql:

    var weekStats2 = from w in db.WeekStats
                            where (w.playerId == player0 || w.playerId == player1 || w.playerId == player2 || w.playerId == player3 || w.playerId == player4)
                                && w.season == 2014
                            select new PlayerIndexViewModel
                            {
                                player = w.player,
                                team = w.player.Team,
                                weekStat = w,
                                statCat_5 = w.statCat_5

                            };

当我将其粘贴到sql server中时,它运行正常(各个玩家都获得了自己的统计数据,而不仅仅是Peyton统计数据的副本)。

1 个答案:

答案 0 :(得分:0)

当SQL返回预期结果而C#代码没有时,看起来问题与JOIN本身无关。

看起来更像是"价值与参考"问题。为每个玩家创建了一个新的PlayerIndexViewModel实例,但这些实例引用了一个Weekstats实例,并根据结果判断它可能是所有行上的相同实例。

要检查这是否是问题,请尝试为weekStart分配w而不是w本身的克隆(假设WeekStats是可克隆的)。

我不知道为什么这个问题会比玩家或团队更多地影响WeekStats(截至第一个代码片段);答案可能就是类绑定到表格的方式。

有关类似问题的问题已经回答here