带有联接的 LINQ 查询返回不正确的值/关联



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

     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
                            };

乍一看,一切看起来都很棒,每个玩家都会得到 16 个结果。 但是,我仔细观察,发现它只是返回了佩顿所有三名球员的数据! (现在,大多数玩家不会抱怨获得佩顿的数据,但我想这不是重点......

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

    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)

注意:在这个例子中,我们只选择了 3 个玩家,所以 -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
                        };

我还添加了一行,专门查看一个统计数据以查看正在发生的事情:

    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
                            };

当我运行它并逐步完成调试器时,我看到每个玩家的statCat_5都是正确的,但 weekStat 中的值仍然与 Peyton 的统计数据重复。 同样奇怪的是,罗杰斯和勒克的正确一周丢失了(这意味着 3 名球员中的每一个都有不同的告别周,因此数据中缺少相关的一周)。

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

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

{SELECT 
[Extent1].[season] AS [season], 
[Extent2].[playerId] AS [playerId], 
[Extent2].[playerName] AS [playerName], 
[Extent2].[teamAbbre] AS [teamAbbre], 
[Extent2].[position] AS [position], 
[Extent3].[teamAbbre] AS [teamAbbre1], 
[Extent3].[geoName] AS [geoName], 
[Extent3].[teamName] AS [teamName], 
[Extent3].[conference] AS [conference], 
[Extent3].[division] AS [division], 
[Extent3].[imageURL] AS [imageURL], 
[Extent1].[weekNum] AS [weekNum], 
[Extent1].[playerId] AS [playerId1], 
[Extent1].[statCat_1] AS [statCat_1], 
[Extent1].[statCat_2] AS [statCat_2], 
[Extent1].[statCat_3] AS [statCat_3], 
[Extent1].[statCat_4] AS [statCat_4], 
[Extent1].[statCat_5] AS [statCat_5], 
.....
[Extent1].[statCat_90] AS [statCat_90], 
[Extent1].[statCat_91] AS [statCat_91]
FROM   [dbo].[WeekStat] AS [Extent1]
INNER JOIN [dbo].[Player] AS [Extent2] ON [Extent1].[playerId] = [Extent2].   [playerId]
LEFT OUTER JOIN [dbo].[Team] AS [Extent3] ON [Extent2].[teamAbbre] = [Extent3].[teamAbbre]
WHERE (2014 = [Extent1].[season]) AND ([Extent1].[playerId] IN          (@p__linq__0,@p__linq__1,@p__linq__2,@p__linq__3,@p__linq__4))}

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

由于 SQL 返回预期的结果,而 C# 代码没有,因此问题似乎与 JOIN 本身无关。

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

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

我无法说出为什么这个问题对 WeekStats 的影响大于球员或团队(截至第一个代码片段);答案可能是类绑定到表的方式。

这里回答了关于类似问题的问题

相关内容

  • 没有找到相关文章

最新更新