2016-10-17 6 views
1

Я очень новичок в asp.net. Для некоторых людей мой вопрос мешает сообществу.Получение значений в зависимости от состояния

У меня есть запрос, который извлекает данные из хранимой процедуры, как это:

result = context.GetEmployeeTraining(idTraining, 
            idArea, 
            idDepartment, 
            type ? "(1),(2)" : "(3)").ToList(); 

и у меня есть этот запрос, чтобы получить список филиалов:

IGenericRepository<Employee> employee = new GenericRepository<Employee>(); 
var branchList = employee.GetList(x => x.BranchOfficeId == userId).ToList(); 

Как отфильтровать результаты из первого запроса, чтобы получить только элементы, которые находятся в branchList?

Сначала я пытался получить от где условия, как:

result = context.GetEmployeeTraining(idTraining, 
             idArea, 
             idDepartment, 
             type ? "(1),(2)" : "(3)") 
       .Where(x => x.BranchOfficeId == userId).ToList(); 

Но получить только одно значение вместо списка, как мой branchList теперь делать

var branchList = employee.GetList(x => x.BranchOfficeId == userId).ToList(); 

GetEmployeeTraining хранимой процедуры:

public virtual ObjectResult<EmployeeTraining> GetEmployeeTraining(Nullable<int> idTraining, 
    Nullable<int> idArea, 
    Nullable<int> idDepartment, 
    string type) 

Площадь запроса

IGenericRepository<Area> area = new GenericRepository<Area>(); 
var areaList = area.GetList(x => x.Id == idArea).Select(x => x.Id); 

        result = context.GetEmployeeTraining(idTraining, idArea, idDepartment, type ? "(1),(2)" : "(3)") 
        .Where(x => branchList.Any(b => b.BranchOfficeId == x.BranchOfficeId) && areaList.Contains(x.Id)) 
        .ToList(); 
+0

Пожалуйста, покажите, что вы пробовали. Также не совсем понятно, что вы делаете: параметр называется 'branchList', но таблица' employee'? –

+0

Да, я обновил свой вопрос @GiladGreen – Dawin

+0

Я хочу, чтобы вы попросили метод, это хранимая процедура, я загружаю его @GiladGreen – Dawin

ответ

0

Один из способов заключается в использовании .Any:

var branchList = employee.GetList(x => x.BranchOfficeId == userId); 

var result = context.GetEmployeeTraining(idTraining, 
             idArea, 
             idDepartment, 
             type ? "(1),(2)" : "(3)") 
        .Where(x => branchList.Any(b => b.BranchOfficeId == x.BranchOfficeId)) 
        .ToList(); 

Другой вариант, если вы chnage запрос на branchList является использование Contains:

var branchList = employee.GetList(x => x.BranchOfficeId == userId) 
         .Select(x => x.BranchOfficeId); 

var result = context.GetEmployeeTraining(idTraining, 
             idArea, 
             idDepartment, 
             type ? "(1),(2)" : "(3)") 
        .Where(x => branchList.Contains(x.BranchOfficeId)) 
        .ToList(); 

Как Haitham упоминалось в комментариях, и причина, по которой я попросил увидеть функцию GetEmployeeTraining, добавив эти условия Where после вызова хранимой процедуры, означает, что фильтрация происходит в памяти. Если вместо хранимой процедуры вы будете делать эти запросы в linq (и, например, с GetEmployeeTraining в качестве метода расширения), то добавление дополнительного Where будет фильтровать результаты в базе данных.

+0

Применение условия 'Where' после вызова процедуры будет фильтровать данные в памяти, а не на уровне SQL –

+0

@HaithamShaddad - верный. Вот почему изначально я хотел увидеть определение «GetEmployeeTraining». Обновленный ответ –

+0

@ GiladGreen вы там? – Dawin

0

Вы должны изменить свою процедуру, чтобы принять параметр табличного типа и передать ему список ветвей, поскольку EF не будет генерировать динамический SQL для вас в этом случае, и любая фильтрация после процедуры вызова будет в памяти.

Так что, если ваша процедура возвращает 500 сотрудников, и результаты хотел для выбранных веток было 50, то вы впустую свои ресурсы для получения дополнительно 450 записей

Смежные вопросы