Tenho esses dados em uma tabela e estou tentando fazer um loop ou um método recursivo. Preciso obter o resultado com base no uso do ID da reunião. Se eu estiver usando o MeetingID 1, ele retornará 2,3. Se eu fizer o MeetingID 2, obterei 1,3 e se fizer 3, obterei 1,2. Tenho esse método mas preciso ligar muitas vezes e queria saber se existe uma maneira melhor. Acredito que preciso do linq para percorrer a cadeia de reuniões pai/anterior e um que atravesse a cadeia de reuniões secundárias/continuação.
MeetingId ContinuedMeetingId
---------- -------------
1 2
2 3
3 null
EF/Linq:
var y = (from m in Meetings
where m.MeetingId == MeetingId
select new
{
ContinuedMeetingsId = db.Meetings
.Where(s => s.MeetingId == m.MeetingId)
.Select(s => s.ContinuedMeetingId).FirstOrDefault()
}).FirstOrDefault();
Isso pode ser feito em SQL usando dois CTEs recursivos - um que atravessa a cadeia de reunião pai/anterior e outro que atravessa a cadeia de reunião secundária/continuação. (A reunião original é excluída de ambas as listas.) É então apenas uma questão de executar a
UNION ALL
e (se desejado) aSTRING_AGG()
para construir a lista final separada por vírgulas.Essa lógica pode ser agrupada em uma função definida pelo usuário que pode então ser adicionada ao modelo do Entity Framework e chamada a partir do seu aplicativo.
A lógica acima pressupõe que a cadeia de reuniões é linear com um relacionamento pai/filho 1 para 1. Se os relacionamentos da reunião puderem ser muitos para muitos, a travessia do gráfico seria muito mais complicada.
Embora lógica semelhante possa ser implementada em C#, não conheço uma maneira de escrever uma instrução LINQ recursiva equivalente que mapeie para uma única execução de consulta SQL. Uma implementação nativa do LINQ provavelmente faria um loop e executaria várias consultas. (Acredito que existam alguns complementos que fornecem suporte limitado a CTE, mas não sei se eles suportam recursão ou seriam adaptados a esta solução. Isso exigiria mais investigação.)
Resultados (com alguns dados de teste extras):
Veja este db<>fiddle para uma demonstração.
Honestamente, ainda não tenho certeza do que você quer fazer. e você acabou de editar sua pergunta copiando e colando algumas palavras-chave da primeira resposta recebida.
Portanto, presumo que a resposta anterior esteja mais ou menos alinhada com o que você está procurando.
Além disso, você
var y = (from m in Meetings where m.MeetingId == MeetingId select new{}).FirstOrDefault()
pode ser simplificado usandoMeetings.FirstOrDefault(m => m.MeetingId == MeetingId)
.Para escrever um loop while ou método recursivo em Csharp, você pode tentar o código abaixo:
Rascunho, resposta da comunidade
A seguir está uma possível implementação LINQ da resposta SQL recursiva CTE anterior que usa o recurso LINQ To DB – Common Table Expression (CTE) .
Este post inicial é um rascunho da tradução do SQL para C# LINQ baseado na documentação, mas não foi testado e pode precisar de correções. Não tenho experiência com isso, então pode precisar de correções ou outras melhorias. Sinta-se à vontade para editar e melhorar esta resposta conforme achar necessário. Se você puder verificar se isso é uma solução funcional, esses comentários poderão ser editados ou removidos conforme apropriado.