繁体   English   中英

Linq Select使用Or语句VS单独查询

[英]Linq Select with Or Statement VS Separate Queries

我有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_PlayerDbSetPlayerEntities吗?

如果是这样,则不需要foreach。 您可以这样做:

这只是伪代码,我现在没有IDE。

playerListEv.AddRange(db.B_Player.Where(i => i.CurrentTeamId == teamIdEv).ToList());
playerListDep.AddRange(db.B_Player.Where(i => i.CurrentTeamId == teamIdDep).ToList());

首先,投影可以最大限度地减少从表中撤回的列(如果您有很多列),从而在各个方面都可以提供帮助。

其次,您可以代替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个表)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM