Это скорее вопрос производительности, а не кода.
Таким образом, в нашем требовании нам нужно проверить человека в базе данных с указанным ssn под определенным «администратором». Нам также необходимо проверить, находится ли супруга этого человека под тем же администратором.
У нас есть хранимая процедура, которая извлекает всех лиц с указанным администратором.
В нашем коде C # у нас есть список, скажем, встреч. Каждый объект содержит данные для ssn человека и супруга, а также идентификатор администратора.
foreach(var obj in myList) {
Guid adminID = obj.Admin;
string spouseSSN = obj.SpouseSSN,
iSSN = obj.PersonSSn;
List < Person > adminSub = RetrievePersonsUnderAdmin(adminID); //calls the sp
Person spouse = adminSub.FirstOrDefault(p => p.SSN == spouseSSN);
Person iPerson = adminSub.FirstOrDefault(p => p.SSN == iSSN);
}
Это предыдущая реализация. Теперь мы хотели изменить sp, чтобы мы могли сразу же получить человека с помощью ssn. То, что я сделал, заставило его принять необязательный параметр @OptionalCondition nvarchar(max)
, который будет добавлен к предложению WHERE
:
BEGIN
DECLARE
@query nvarchar(max)
SET @query =
'SELECT
. . . . -- select columns
WHERE
. . . . -- where clause
' + ISNULL(@CustomCondition, '') -- additional conditions @CustomCondition, optional
EXEC sys.sp_executesql @query
END
Таким образом, мы могли бы использовать его в нашем коде C # для этого:
Person spouse = RetrievePersonsUnderAdmin(adminID, string.Format("AND p.SSN = '{0}'", spouseSSN)).FirstOrDefault();
Person spouse = RetrievePersonsUnderAdmin(adminID, string.Format("AND p.SSN = '{0}'", iSSN )).FirstOrDefault();
Вопрос в том, что лучше, вызывая 2 sp или предыдущую реализацию? Обратите внимание, что администратор может иметь 500 - 1000 подчиненных.
EDIT:
Если вы, ребята, можете, вы можете опубликовать здесь свои ответы, а также учесть все недостатки, которые вы наблюдали в моем коде. Таким образом, будущие разработчики могут натолкнуться на те же вопросы, что и у меня, и, надеюсь, эта статья поможет им. Спасибо за парни в разделе комментариев за помощь.