Можно ли определить запрос, который будет возвращать необходимые идентификаторы сотрудников, основываясь на каком-либо другом запросе? Если это так, вы можете определить поиск, используя вложенный запрос:
var employeeIds = from x in context.EitherEmployeesOrSomeOtherRecords
where x.SomeConditionIsTrue
select x.EmployeeID; //not yet evaluated; employeeIds is an IQueryable
var employees = from e in context.Employees
where employeeIds.Contains(x.EmployeeID)
select e;
Этот запрос LINQ будет преобразован Linq2SQL в один оператор SQL с использованием предложения EXISTS для проверки SQL-эквивалента подзапроса employeeIds.
Что касается принуждения Linq2SQL к указанию значений из кода в виде литералов, я не думаю, что вы можете, но я могу ошибаться.
РЕДАКТИРОВАТЬ: Хорошо, а что если вы сделали логику, определяющую, как построить запрос умнее? Например, если у вас есть кнопка или флажок «выбрать все», вы можете использовать ее для создания более простого запроса: «подтянуть всех сотрудников, которые были бы выбраны для списка»:
var employees = from e in context.Employees
where TheSameConditionThatCausedItToBeInTheList == true
select e;
Если пользователь выбрал все, а затем отменил выбор нескольких, вы можете обнаружить это (больше выбранных, чем нет) и вместо этого вывести «все сотрудники, КРОМЕ X, Y и Z»:
var notChecked = uiList.Items.Except(uiList.SelectedItems).Select(x=>x.EmployeeID)
var employees = from e in context.Employees
where !notChecked.Contains(e.EmployeeID)
select e;
Если у вас более 4200 сотрудников, описанное выше не всегда будет работать (вы можете выбрать более 2100, но оставить более 2100 невыбранными, так что это в любом случае будет взорвано), но я также не могу представить список 4200 элементов, которые также не позволяют выбирать на основе какого-либо другого показателя (т. Е. Отдела), что позволяет выполнить запрос типа «подтянуть всех сотрудников в отделах X, Y и Z, а также сотрудников A, B и C»:
var metaSelection = departmentList.SelectedItems.Select(x=>x.DepartmentID);
var exceptions = uiList.SelectedItems.Where(x=>!metaSelection.Contains(x.DepartmentID))
.Select(x=>x.EmployeeID);
var employees = from e in context.Employees
where metaSelection.Contains(e.DepartmentID)
|| exceptions.Contains(e.EmployeeID)