Используйте любой запрос или выражения Linq для построения запроса на производительность - PullRequest
0 голосов
/ 26 сентября 2019

мы являемся Entity Framework в нашем проекте.Необходимо знать влияние на производительность между .ANY () и выражениями для формирования предложения Where.

В приведенной ниже функции я использовал два подхода для получения результата:

APPROACH 1 - Form Lambdaзапрос выражения с использованием ANY () Из моих наблюдений использование .Any () не добавляет предложение where при выполнении запроса (проверяется в SQL Server Profiler), что делает EF - получает все совпадающие внутренние объединенные записи, сохраняет в памяти и затем применяет условиеуказано в .ANY ()

ПОДХОД 2 - Запускается выражение выражения С помощью выражений я явно формирую, где предложение и executing.checked то же самое в профилировщике SQL-запросов, я могу видетьгде пункт.Примечание: чтобы сформировать выражение, где предложение я делаю дополнительные циклы и "CombinePredicates".

Теперь я сомневаюсь:

  1. , который повысит производительность.Нужно ли использовать Lambda с .ANY () или выражениями?

  2. Как правильно определить, откуда улучшить положение?

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

private bool GetClientNotifications(int clientId, IList<ClientNotification> clientNotifications)
{
IList<string> clientNotificationList = null;
var clientNotificationsExists = clientNotifications?.Select(x => new { x.Name, x.notificationId 
}).ToList();
if (clientNotificationsExists?.Count > 0)
{

    //**Approach 1 => Form Lamada  Query starts**
    notificationList = this._clientNotificationRepository?.FindBy(x => clientNotificationsExists.Any(x1 => x.notificationId == x1.notificationId && x.clientId == 
  clientId)).Select(x => x.Name).ToList();
    **//Form Lamada  Query Ends**

    //**Approach 2 =>Form Expression Query Starts**
    var filterExpressions = new List<Expression<Func<DbModel.ClientNotification, bool>>>();
    Expression<Func<DbModel.ClientNotification, bool>> predicate = null;
    foreach (var clientNotification in clientNotificationsExists)
    {
        predicate = a => a.clientId == clientId && a.notificationId == clientNotification .notificationId;
        filterExpressions.Add(predicate);
    }
    predicate = filterExpressions.CombinePredicates<DbModel.ClientNotification>(Expression.OrElse);
    clientNotificationList = this._clientNotificationRepository?.FindBy(predicate).Select(x => x.Name).ToList();
    //**Form Expression Query Ends**
}
return clientNotificationList;
  }

Если ни один из подходов не был хорош, пожалуйста, предложите мне правильный способ сделать это.

...