Golden Basim Ответов: 2

Как избежать слишком большого количества (JOINS, SELECT, WHERE) для повышения производительности entity framework ?


привет,
я использую следующие коды для сравнения склад с неснижаемый остаток и получить то, что нет. недостающих предметов как:

int Shortages_StockNoSer = nDB01.stock_noserials
                .GroupBy(x => x.stitems_ID)
                .Select(grp => new
                {
                    itemID = grp.Key,
                    sum = grp.Sum(x => x.StockQnty),
                    min = grp.Select(s => 
                                     s.st_items.stitems_MinBalance).FirstOrDefault()
                }).Where(u => u.sum < u.min && u.min != 0)
                .Count();
int Shortages_StockWithSer = nDB01.purchases_item_seriels
               .GroupBy(x => x.stitems_ID)
               .Select(grp => new
               {
                   itemID = grp.Key,
                   sum = grp.Count(),
                   min = grp.Select(s => 
                                    s.st_items.stitems_MinBalance).FirstOrDefault()
               }).Where(u => u.sum < u.min && u.min != 0)
               .Count();
int CountShortagesItems = Convert.ToInt32( Shortages_StockNoSer) + 
                          Convert.ToInt32(Shortages_StockWithSer);


также это мой код, чтобы получить нет клиентов, чьи балансы превысили кредитный лимит :

int CustomersBalances_StockNoSer = nDB01.people_data
                .GroupBy(x => x.pepole_ID)
                .Select(grp => new
                {
                    itemID = grp.Key,
                    balance = nDB01.account_items.Where(u => (u.account_main.accitem_PeplID == grp.Key && u.accitem_AccID == 10) ||
                                    (u.account_main.accitem_PeplID == grp.Key && u.accitem_AccID == 59)).FirstOrDefault().accitem_Debit -
                                    nDB01.account_items.Where(u => (u.account_main.accitem_PeplID == grp.Key && u.accitem_AccID == 10) ||
                                    (u.account_main.accitem_PeplID == grp.Key && u.accitem_AccID == 59)).FirstOrDefault().accitem_Credit,
                    Limited = grp.Select(s => s.pepole_CreditLimit).FirstOrDefault()
                }).Where(u => (u.balance) > u.Limited )
                .Count();


Что я уже пробовал:

я проверил этот код с помощью Профилировщик Entity Framework и получите это предупреждение :

Первый код оповещения :
СЛИШКОМ МНОГО ВЛОЖЕННЫХ ОПЕРАТОРОВ SELECT

Второй Код Оповещения :
СЛИШКОМ МНОГО ВЛОЖЕННЫХ ОПЕРАТОРОВ SELECT
СЛИШКОМ МНОГО ПРЕДЛОЖЕНИЙ WHERE В ЗАЯВЛЕНИИ
ИЗБЕГАЙТЕ СЛИШКОМ БОЛЬШОГО КОЛИЧЕСТВА СОЕДИНЕНИЙ


Могу ли я что-нибудь сделать с этим?

2 Ответов

Рейтинг:
17

#realJSOP

Напишите хранимую процедуру, которая выполняет нужные соединения, и вызовите ее из entity framework.

Вас должны волновать две вещи: сколько времени занимает запрос и сколько данных он возвращает. EF-это не самый эффективный способ извлечения данных, когда вы делаете join/where.


MadMyche

Подводит итог моим мыслям об эф, спасибо

Golden Basim

спасибо , у меня есть много таких запросов, так что я буду преобразовывать их в "хранимую процедуру" и "представления", но я не префект в этом, не могли бы вы, пожалуйста, я знаю пример для одного из моих кодов !?

Рейтинг:
12

W∴ Balboos, GHB

В дополнение к концепциям из решения 1 можно упростить (кажущиеся) запросы, создав соответствующие представления с помощью соединений, союзов и других компонентов запросов.

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


Golden Basim

спасибо , у меня есть много таких запросов, так что я буду преобразовывать их в "хранимую процедуру" и "представления", но я не префект в этом, не могли бы вы, пожалуйста, я знаю пример для одного из моих кодов !?

W∴ Balboos, GHB

Для просмотра используйте

Создать представление viewName
АС
. . . положите ваш SQL в здесь . . .

Смотрите здесь: https://www.w3schools.com/sql/sql_view.asp
Вы никогда не научитесь делать что-то, пока не начнете бороться с тем, чтобы делать это на самом деле.

Кроме того, когда на ваш вопрос будет дан ответ, Пожалуйста, выберите ответ, который вам нравится, и "примите его", чтобы закрыть свой вопрос.

Golden Basim

спасибо..