Это может быть.
Предположим следующее:
Баланс начального размера, частоты чтения и частоты обновления базовогоТаблица такова, что нет смысла заменять все это загрузкой всего в память и просто неоднократно смотреть на это.
Для каждого идентификатора есть только одна подходящая строка.
Есть ряд других интересных полей в строке, которые нас не волнуют.
Тогда, если мы заменили PrivilegeMap наLinq2SQL Table<Privileges>
, эквивалентный код LINQ будет выглядеть примерно так:
var result = PrivilegeMap.Where(p => p.PrivilegeActionId == actionID).Select(p => new{p.ModeratorHasIt, p.AdminHasIt}).First()
if (myRole == User.Role.Admin)
{
return result.AdminHasIt;
}
if (myRole == User.Role.Moderator)
{
return result.ModeratorHasIt;
}
else
{
return false;
}
(В этом отношении var result = PrivilegeMap.Where(p => p.PrivilegeActionId == actionID).First(p => new{p.ModeratorHasIt, p.AdminHasIt})
также можно записать как var result = (from p in PrivilegeMap where p.PrivilegeActionId == actionID select new{p.ModeratorHasIt, p.AdminHasIt}).First()
Это просто другой синтаксис для тех же операций LINQ).
Допустим, actionID
- это 2
Ваш код будет преобразован в SQL следующим образом:
SELECT * FROM Привилегии WHERE privilegeActionId = 2
Linq выше будет превращен в:
SELECT TOP 1 adminHasIt, moderatorHasIt FROM Privileges WHERE privilegeActionId
Вы можете видеть, как, если бы это была таблица с большим количеством столбцов и / или если было несколько совпадающих строк, это могло бы быть гораздо более эффективным.
(Если бы PrivilegeMap был перечислимым, но не запрашиваемым, он превратился бы в операцию, в которой все это было загружено и отсканировано, и, следовательно, вообще неэффективно).
С другой стороны, код для его созданияSQL может быть более сложным, и он требует некоторой работы по настройке объектов сущностей привилегий.Если бы это была одноразовая операция, она, безусловно, не стоила бы ее с точки зрения эффективности как для разработчика, так и для среды выполнения, но в противном случае она могла бы принести пользу обоим.
Однако обратите внимание, что в обоих наших случаях мы запрашиваембез необходимости.Я бы на самом деле заменил мой на:
if (myRole == User.Role.Admin)
{
return PrivilegeMap.Where(p => p.PrivilegeActionId == actionID).Select(p => p.AdminHasIt).First();
}
if (myRole == User.Role.Moderator)
{
return PrivilegeMap.Where(p => p.PrivilegeActionId == actionID).Select(p => p.ModeratorHasIt);
}
else
{
return false;
}
, который будет либо запрашивать только adminHasIt, просто moderatorHasIt, либо вообще не запрашивать, поскольку мы гарантируем false для любого другого значения myRole
независимо от того, в каком состоянии находится база данных .
Аналогичным образом, вы получаете гораздо более простое улучшение:
if(myRole != User.Role.Admin && myRole != User.Role.Moderator)
return false;
DataRow[] result = PrivilegeMap.Select("privilegeActionId=" + (int)actionId);
if (myRole == User.Role.Admin)
{
return Convert.ToBoolean(result[0]["adminHasIt"]);
}
if (myRole == User.Role.Moderator)
{
return Convert.ToBoolean(result[0]["moderatorHasIt"]);
}
Здесь мы сначала полностью избегаем запроса к базе данных, если не можем использоватьэто, только конвертируйте интересующую нас область, и впоследствии не конвертируйте bool в bool.Такого рода локальные размышления о том, какие данные на самом деле используются, гораздо проще сделать, и, хотя большинство таких сбережений невелики, некоторые из них велики (это может быть), и это скорее привычка, чем сложные компромиссы.