Да, ваше второе решение более эффективно!
Вы используете DbContext для доступа к вашей таблице.Видимо эта таблица находится в базе данных.Системы управления базами данных чрезвычайно оптимизированы для запросов данных.
Однако одной из более медленных частей запроса является транспортировка запроса и выбранных данных между вашим процессом и СУБД.Следовательно, разумно ограничить это.
Ваш метод foreach будет выполнять один запрос на комбинацию [role, id].Это очень неэффективно.Ваш второй метод будет принимать только один запрос и возвращать только одну результирующую последовательность.Это намного эффективнее.
Добавление:
Иван Стоев показал мне, что приведенный ниже метод не работает: в отличие от IEnumerable, IQueryable.Contains может обрабатывать толькопримитивные типы.Следовательно, содержимое Contains ниже не будет работать.
Поэтому следующее не работает как IQueryable.
Этот запрос может быть немного оптимизирован: позвольте вашему процессу создать последовательность требуемой [роли,id] комбинаций и запросите в базе данных все TableNames
, которые соответствуют этой комбинации.
class RoleIdCombination
{
public char Role {get; set;}
public int Id {get; set;}
}
// let your process create the requested RoleIdCombinations:
var roleIdCombinations = CreateRoleIdCombinations(roles, ids);
// do only one query:
var result = dbContext.TableNames
.Select(tableName => new
{
// for easier equality check: make a RoleIdCombination:
RoleIdCombination = new RoleIdCombination
{
Role = tableName.Role,
Id = tableName.Id,
}
// remember the original item
TableName = tableName,
})
.Where(item => roleIdCombinations.Contains(item.RoleIdCombination));
Итак, теперь вы знаете, что ваша система управления базами данных будет перечислять вашу таблицу только один раз.
Функция CreateRoleIdCombinations
:
IEnumerable<RoleIdCombination> CreateRoleIdCombinations(
IEnumerable<char> roles,
IEnumerable<int> ids)
{
foreach (var role in roles)
{
foreach (var id in ids)
{
yield return new RoleIdCombination
{
Role = role,
Id = id,
};
}
}
}
Для этого нам нужны (количество ролей * количество идентификаторов) перечисления.Я ожидаю, что это будет намного меньше, чем количество элементов в вашей таблице, в конце концов, вы не будете удалять половину таблицы каждый раз, не так ли?