Выбор Linq с помощью оператора Or или отдельных запросов - PullRequest
0 голосов
/ 21 мая 2018

У меня есть 30 таблиц avareage, и я хочу отсканировать все данные во всех таблицах, но я получаю ошибку тайм-аута в проекте MVC с Entity Framework.Вы представляете, что сканируете данные для каждой буквы в алфавите, как этот код;

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

                }

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Во-первых, проекция может помочь в этом отношении, сводя к минимуму столбцы, которые вы извлекаете из своих таблиц (если у вас много столбцов).

Во-вторых, вы можете вместо этого сделать 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();

Или вы можете спроецировать всех своих игроков и отфильтровать их в памяти,

Тем не менее, вам нужно поработать над тем, что здесь является узким местом.

0 голосов
/ 21 мая 2018

Ваш db.B_Player DbSet из PlayerEntities?

Если так, то foreach не нужен.Вы можете просто сделать:

Это просто псевдокод. Сейчас у меня нет IDE.

playerListEv.AddRange(db.B_Player.Where(i => i.CurrentTeamId == teamIdEv).ToList());
playerListDep.AddRange(db.B_Player.Where(i => i.CurrentTeamId == teamIdDep).ToList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...