C# Linq Select with Or语句与单独查询

C# Linq Select with Or语句与单独查询,c#,entity-framework,linq,C#,Entity Framework,Linq,我有30个表,我想扫描所有表中的所有数据,但在使用Entity Framework的MVC项目中出现超时错误。想象一下,像这样的代码扫描字母表中每个字母的数据 foreach (var item in db.A_Player.Where(i=>i.CurrentTeamId == teamIdEv || i.CurrentTeamId == teamIdDep)) { PlayerEnti

我有30个表,我想扫描所有表中的所有数据,但在使用Entity Framework的MVC项目中出现超时错误。想象一下,像这样的代码扫描字母表中每个字母的数据

               foreach (var item in db.A_Player.Where(i=>i.CurrentTeamId == teamIdEv || i.CurrentTeamId == teamIdDep))
                {
                    PlayerEntity player = new PlayerEntity()
                    {
                        Name = item.Name,
                        Surname = item.Surname,
                        Id = item.Id,
                        CurrentTeamId = item.CurrentTeamId

                    };

                    if (item.CurrentTeamId == teamIdEv)
                    {
                        playerListEv.Add(player);
                    }
                    else
                    {
                        playerListDep.Add(player);
                    }

                }
                foreach (var item in db.B_Player.Where(i => i.CurrentTeamId == teamIdEv || i.CurrentTeamId == teamIdDep))
                {
                    PlayerEntity player = new PlayerEntity()
                    {
                        Name = item.Name,
                        Surname = item.Surname,
                        Id = item.Id,
                        CurrentTeamId = item.CurrentTeamId

                    };

                    if (item.CurrentTeamId == teamIdEv)
                    {
                        playerListEv.Add(player);
                    }
                    else
                    {
                        playerListDep.Add(player);
                    }

                }
问题解决问题我可以使用像下面代码这样的单独查询,还是两者都相同?这两者的结果与速度相同?如何超越超时错误

foreach (var item in db.B_Player.Where(i => i.CurrentTeamId == teamIdEv))
                {
                    PlayerEntity player = new PlayerEntity()
                    {
                        Name = item.Name,
                        Surname = item.Surname,
                        Id = item.Id,
                        CurrentTeamId = item.CurrentTeamId

                    };

                    if (item.CurrentTeamId == teamIdEv)
                    {
                        playerListEv.Add(player);
                    }
                    else
                    {
                        playerListDep.Add(player);
                    }

                }

                foreach (var item in db.B_Player.Where(i => i.CurrentTeamId == teamIdDep))
                {
                    PlayerEntity player = new PlayerEntity()
                    {
                        Name = item.Name,
                        Surname = item.Surname,
                        Id = item.Id,
                        CurrentTeamId = item.CurrentTeamId

                    };

                    if (item.CurrentTeamId == teamIdEv)
                    {
                        playerListEv.Add(player);
                    }
                    else
                    {
                        playerListDep.Add(player);
                    }

                }

你的
db.B_播放器是
playentities的
a
DbSet

如果是这样,则不需要foreach。您只需执行以下操作:

这只是伪代码,我现在没有IDE可供使用


你的
db.B_播放器是
playentities的
a
DbSet

如果是这样,则不需要foreach。您只需执行以下操作:

这只是伪代码,我现在没有IDE可供使用


首先,投影可以减少从表中提取的列(如果有很多列),从而在这方面有所帮助

其次,你可以做2个较小的查询

var evs = db.B_Player.Where(i => i.CurrentTeamId == teamIdEv)
                     .Select(x => new PlayerEntity // projection
                     {
                        Name = item.Name,
                        Surname = item.Surname,
                        Id = item.Id,
                        CurrentTeamId = item.CurrentTeamId
                     }).ToList();

var deps= db.B_Player.Where(i => i.CurrentTeamId != teamIdEv)
                     .Select(x => new PlayerEntity // projection
                     {
                        Name = item.Name,
                        Surname = item.Surname,
                        Id = item.Id,
                        CurrentTeamId = item.CurrentTeamId
                     }).ToList();
或者你可以投射你所有的玩家并在内存中过滤他们

然而,你需要了解这里的瓶颈是什么

  • CurrentTeamId
    是否合适
  • 数据库是否正确(正如您所说,您有30个表)

首先,投影可以减少从表中提取的列(如果有很多列),从而在这方面有所帮助

其次,你可以做2个较小的查询

var evs = db.B_Player.Where(i => i.CurrentTeamId == teamIdEv)
                     .Select(x => new PlayerEntity // projection
                     {
                        Name = item.Name,
                        Surname = item.Surname,
                        Id = item.Id,
                        CurrentTeamId = item.CurrentTeamId
                     }).ToList();

var deps= db.B_Player.Where(i => i.CurrentTeamId != teamIdEv)
                     .Select(x => new PlayerEntity // projection
                     {
                        Name = item.Name,
                        Surname = item.Surname,
                        Id = item.Id,
                        CurrentTeamId = item.CurrentTeamId
                     }).ToList();
或者你可以投射你所有的玩家并在内存中过滤他们

然而,你需要了解这里的瓶颈是什么

  • CurrentTeamId
    是否合适
  • 数据库是否正确(正如您所说,您有30个表)

1)您应该优化数据库操作。
CurrentTeamId
是否有索引?2) 即使对查询进行了高度优化,也不能保证不会发生超时。真正的问题是在一个请求中迭代了30个表。解决方案可以是-i)将请求超时时间增加到最大值。ii)检查是否要为请求从所有30个表中获取数据-尝试优化SQL查询,如果需要,则直接编写SQL SP或查询。Hrm这似乎有点像xy'ish。首先,您应该使用投影,整个扫描30表的事情闻起来有点可疑,就像一个表规范化问题1)您应该优化数据库操作。
CurrentTeamId
是否有索引?2) 即使对查询进行了高度优化,也不能保证不会发生超时。真正的问题是在一个请求中迭代了30个表。解决方案可以是-i)将请求超时时间增加到最大值。ii)检查是否要为请求从所有30个表中获取数据-尝试优化SQL查询,如果需要,则直接编写SQL SP或查询。Hrm这似乎有点像xy'ish。首先,您应该使用投影,整个扫描30表的事情闻起来有点可疑,就像一个表规范化问题这提供了一个可见的好处这提供了一个可见的好处