мы являемся Entity Framework в нашем проекте.Необходимо знать влияние на производительность между .ANY () и выражениями для формирования предложения Where.
В приведенной ниже функции я использовал два подхода для получения результата:
APPROACH 1 - Form Lambdaзапрос выражения с использованием ANY () Из моих наблюдений использование .Any () не добавляет предложение where при выполнении запроса (проверяется в SQL Server Profiler), что делает EF - получает все совпадающие внутренние объединенные записи, сохраняет в памяти и затем применяет условиеуказано в .ANY ()
ПОДХОД 2 - Запускается выражение выражения С помощью выражений я явно формирую, где предложение и executing.checked то же самое в профилировщике SQL-запросов, я могу видетьгде пункт.Примечание: чтобы сформировать выражение, где предложение я делаю дополнительные циклы и "CombinePredicates".
Теперь я сомневаюсь:
, который повысит производительность.Нужно ли использовать Lambda с .ANY () или выражениями?
Как правильно определить, откуда улучшить положение?
Если нет двух подходов, предложите мне правильный способ сделать это
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;
}
Если ни один из подходов не был хорош, пожалуйста, предложите мне правильный способ сделать это.