LINQ to SQL использование списка как фильтр

112
16 июня 2019, 11:00

Помогите разобраться. Я только начал изучать Sharp и LINQ по этому каждый шаг дается с трудом, вот и сейчас столкнулся с проблемой, решение которой не могу найти уже несколько дней.

Есть 3 таблицы "Сотрудники", "Движение сотрудников" и "Должности", мне нужно объединить "Сотрудники" и "Должности" используя "Движение" в качестве посредника (взяв от туда последнюю запись по каждому сотруднику), соответственно в движении может быть как одна запись на сотрудника, так и десять.

В результате получился код который создает нужный мне список посредник, но в конечном результате выдает "Локальная последовательность не может быть использована в реализациях операторов запросов LINQ to SQL, кроме оператора Contains".

List<WorkerMove> Rank = new List<WorkerMove>();
var idRank = (from rank1 in context.Worker select rank1.codeWorker);
foreach (var read in idRank)
 {      
  WorkerMove Rank3 = (from rank2 in context.WorkerMove 
                      where rank2.idWorker == read 
                      select rank2).FirstOrDefault();
  if(Rank3 != null) Rank.Add(Rank3);
 }
 var workerSurname = from worker in context.Worker
     join workMove in Rank on worker.codeWorker equals workMove.idWorker 
     join workRank in context.Dol on workMove.idRank equals workRank.idDol 
     select new
     {
      codeWork = worker.codeWorker,
      Fio = worker.Family+ " " + worker.Name.Remove(1) + "." + worker.Otch.Remove(1) + ".",
      Dol = workRank.Dol,
     };

Понятно что проблема в моей попытке использовать Rank в качестве присоединенной таблицы. Сейчас думаю передать список элементов во временную таблицу на стороне сервера и использовать ее в качестве посредника. Но наверняка есть другие способы решения задачи.

p.s. структура таблиц:

Сотрудники (Worker) = {codeWorker (int), NameWorker (string)}

Движение (workerMove) = {idMove (int), idWorker (int), idRank (int), Data (DateTime)}

Должность (Dol) = {idDol (int), Dol(string)}

codeWorker (int)=idWorker (int)

idRank (int) = idDol (int)

Answer 1

Переработал код следующим образом:

List<int> Rank = new List<int>();
var workerSurname = from worker in context.Worker
join workMove in context.WorkerMove on worker.codeWorker equals workMove.idWorker 
join workRank in context.Dol on workMove.idRank equals workRank.idDol
select new //выбор всего списка сотрудников, включающий все передвижения
 {
  codeWork = worker.codeWorker, 
  Fio = worker.Name,
  Dol = workRank.Dol
 };
var Rankid = (from rank1 in context. Worker select rank1. codeWorker); //создание списка ID Сотрудников (без дубликатов)
foreach (var read in Rankid)
 {
  //сравнение списка ID сотрудников с обобщенным списком и выбор актуальной записи 
  var Rank3 = (from rank2 in workerSurname where rank2.codeWork == read select rank2).FirstOrDefault(); 
  Rank.Add(Rank3.codeWork); // добавление выбранной записи в лист
 }

Это кусок отредактированного кода, отражающий общий смысл, в оригинале пришлось добавить еще много чего, что бы ускорить работу, но основной вопрос "Как сформировать подобный список" решен.

READ ALSO
Ошибка при проверке файла Hunspell

Ошибка при проверке файла Hunspell

Как можно поднять на ubuntu 1604 сервере hunspell php После дебага ругается на отсутствия файлов

147
Обновление AJAX

Обновление AJAX

Помогите разобратьсяЕсть страница, на ней выводятся блоки

112
Как хранить часовой пояс в конфигурации?

Как хранить часовой пояс в конфигурации?

В основной конфигурации приложения я решил хранить часовой пояс в виде объекта DateTimeZone:

105