Any () Метод Linq, выполняющий несколько запросов к одному и тому же объекту. C # EF CORE - PullRequest
0 голосов
/ 17 октября 2019

Я сделал несколько поисков, и я все еще борюсь с этим. Я хочу выполнить этот запрос на ядре EF, используя sql server Exists ():

Проблема в том, что в sql server выполнение приведенного ниже запроса занимает около 2 секунд. А на C # с использованием метода Any () это занимает более 1 минуты. Он делает несколько запросов к таблицам HutOperationHistory и HutPropertyValue.

// занимает 1-2 секунды

select * From Hut h where exists(
    select 1 from HutOperationHistory 
             where HutId = h.HutId and HutOperationId = 4
)
and exists(
    select 1 from HutPropertyValue 
             where HutId = h.HutId and Value = 'HUT_SUPPLIER_PROPERTY_NAME'
)
and exists(
    select 1 from HutPropertyValue 
             where HutId = h.HutId and Value = 'BUY_ORDER_PROPERTY_NAME'
)
and exists(
    select 1 from HutPropertyValue 
             where HutId = h.HutId 
             and Value = 'WORK_ORDER_PROPERTY_NAME'
)

Я сделал это на linq, и это выглядит так:

// takes more then 1 minute



  var huts = coreDbContext.Huts
        .Include(x => x.PropertyValuesList).ThenInclude(y => y.HutProperty)
        .Include(x => x.OperationHistoriesList)
        .Where(
            x => 
             x.OperationHistoriesList.Any(
                z => ( z.HutOperation.hutOperationId = 4 )
            )
            && x.PropertyValuesList.Any(b => 
                    b.Value.Equals(hutSupplierPropName, StringComparison.CurrentCultureIgnoreCase)                  
                )
            && x.PropertyValuesList.Any(b =>
                b.Value.Equals(buyOrderPropName, StringComparison.CurrentCultureIgnoreCase)             
            )
            && x.PropertyValuesList.Any(b =>
                b.Value.Equals(workOrderPropName, StringComparison.CurrentCultureIgnoreCase)                
            )
        )
        .OrderBy(x => x.Order)
        .ToList();

Есть ли что-нибудь, что я могу сделать, чтобы сделать это быстрее?

Спасибо заранее!

1 Ответ

0 голосов
/ 17 октября 2019

Вместо Any (), попробуйте Count ()> 0. У меня был прирост производительности при использовании этого в прошлом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...