Помогите разобраться. Я только начал изучать 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)
Переработал код следующим образом:
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); // добавление выбранной записи в лист
}
Это кусок отредактированного кода, отражающий общий смысл, в оригинале пришлось добавить еще много чего, что бы ускорить работу, но основной вопрос "Как сформировать подобный список" решен.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как можно поднять на ubuntu 1604 сервере hunspell php После дебага ругается на отсутствия файлов
В основной конфигурации приложения я решил хранить часовой пояс в виде объекта DateTimeZone: