Помогите разобраться. Я только начал изучать 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); // добавление выбранной записи в лист
}
Это кусок отредактированного кода, отражающий общий смысл, в оригинале пришлось добавить еще много чего, что бы ускорить работу, но основной вопрос "Как сформировать подобный список" решен.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости