sri4dotnet Ответов: 2

Преобразуйте 2 цикла foreach, которые имеют лямбда-выражения, в один или два лямбда-оператора, чтобы удалить для каждого цикла


Привет,

Мне нужно преобразовать 2 для каждого цикла, которые показаны ниже, в linq -

List<Company> res = new List<Company>();
          List<EmployeeCount> result = new List<EmployeeCount>();
          foreach (string s in indType)
          {
              List<Company> re = _entities.Company.Where(a => Convert.ToString(a.industry_id.ToLower()).Equals(s.ToLower().ToString())).ToList();
              res.AddRange(re);
          }

          foreach (Company r in res)
          {
              List<EmployeeCount> empCount = await _entities.EmployeeCount.Where(a => Convert.ToString(a.Company_ID.ToLower()).Equals(r.Company_id.ToLower())).Select((a => new EmployeeCount() { Company_ID = a.Company_ID, Industry_ID = a.Industry_ID, Company_Name = a.Company_Name, City = a.City, Number_Employees = a.Number_Employees })).ToListAsync();
              result.AddRange(empCount);
          }
          return result.AsQueryable();



Мне нужно оптимизировать эти циклы foreach с помощью лямбда-выражений, чтобы быстро получать данные. Пожалуйста, помогите мне в этом.

Что я уже пробовал:

попробовал, как показано ниже -

РЭС.По каждому элементу(я => У меня.company_id).пересекаются(_entities.Элемент employeecount.Выберите(i => i.company_id).Список();

его, показывая это возвращает список<строка&ГТ; только, мне нужен список<элемент employeecount&ГТ;. Невозможно выбрать значения объекта EmployeeCount.

F-ES Sitecore

Ваши циклы linq, вероятно, будут медленнее, чем ваш существующий код. Linq не предназначен для производительности. Если это ваша цель, то оставьте свой код как есть.

2 Ответов

Рейтинг:
2

TheFoZ

Если вы ищете скорость, петли-это путь.

Я хотел бы взглянуть на ваши данные. Есть ли в каждой компании количество сотрудников? Если они это делают, то нет необходимости в первом цикле. Все, что делает первый цикл, - это получает список идентификаторов компаний на основе идентификатора отрасли, который вы затем используете во втором цикле, который также имеет идентификатор отрасли.

Вам также нужно создать новый экземпляр EmployeeCount или вы можете использовать исходный объект? Использование оригинала позволит сэкономить время, а не создавать новый экземпляр.

Я бы сделал что-то подобное, если первый цикл не имеет значения, и вам не нужна копия объекта

List<EmployeeCount> result = new List<EmployeeCount>();

foreach (EmployeeCount c in _entities.EmployeeCount)
{
    if (indType.Contains(c.industry_id))
    {
        result.Add(c);
    }
}

return result;


Рейтинг:
1

Richard Deeming

Не совсем ясно, что вы пытаетесь сделать, но предполагая, что вы используете Entity Framework, что-то вроде этого должно работать:

return _entities.EmployeeCount.Where(ec => indType.Contains(ec.Industry_ID));

Если Industry_ID колонка на стене EmployeeCount сущность не соответствует столбцу с тем же именем на Company сущность, то вам понадобится свойство навигации:
return _entities.EmployeeCount.Where(ec => indType.Contains(ec.Company.Industry_ID));

Если EmployeeCount set не возвращает экземпляр вашего EmployeeCount класса, а затем добавить .Select(...) до конца:
return _entities.EmployeeCount
    .Where(ec => indType.Contains(ec.Industry_ID))
    .Select(ec => new EmployeeCount
    {
        Company_ID = ec.Company_ID, 
        Industry_ID = ec.Industry_ID, 
        Company_Name = ec.Company_Name, 
        City = ec.City, 
        Number_Employees = ec.Number_Employees,
    });


sri4dotnet

да, я использую ядро Entity Framework, вышеупомянутый код был написан в методе, который имеет входной параметр в виде string[] indType.
для каждой строки в indType я извлекаю данные из таблицы Company с помощью linq и загружаю в список<company>.
Основываясь на список<компании&ГТ;, снова я извлечения данных из базы данных с помощью LINQ для список<элемент employeecount&ГТ; на основе company_id.

Richard Deeming

Так что попробуйте код, который я опубликовал - он должен быть значительно быстрее.