LINQ to SQL fazendo uma União e Left Outer Join
-
20-08-2019 - |
Pergunta
Eu tenho 3 tabelas. 2 contêm listas de arquivos que eu preciso fazer um UNION em obter todos os arquivos únicos, então eu quero fazer uma junção externa esquerda contra a tabela 3 para encontrar todos os arquivos que estão no 3º tabela somente e não na outra 2.
Para fazer a UNIÃO Eu tenho o seguinte:
var imageUnion = (from img in dc.ImageT1
select img.filename).Union(
from img in dc.ImageT2
select img.filename);
Agora, para obter os arquivos apenas no 3.º mesa eu faria uma junção externa esquerda como tal:
var query = from image in dc.ImageT1
join active in dc.ActiveImages on image.filename equals
active.filename into gj
from subimage in gj.DefaultIfEmpty()
where subimage.filename == null
select new { image.filename, image.size };
Eu entendo como fazer a junção externa esquerda simplesmente contra uma mesa, mas como faço para obter o conjunto de resultados da minha primeira consulta na junção externa esquerda? Basicamente, em vez de fazer a junção externa esquerda contra ImagesT1 eu quero fazê-lo contra o resultado imageUnion.
Obrigado!
Solução
Você precisa selecionar mais de uma propriedade em sua União; O resultado atual é IEnumerable
var imageUnion = (from img in dc.ImageT1
select new { Filename = img.filename, Size = img.size }).Union(
from img in dc.ImageT2
select new { Filename = img.filename, Size = img.size });
Em seguida, você deve ser capaz de usá-lo na segunda consulta para substituir dc.ImageT1.
Apesar de pensar mais sobre ele, a União não pode trabalhar com 2 tipos anônimos; Para suportar isso, talvez seria importante definir uma classe que tem apenas um nome de arquivo e tamanho?
public class TempImage
{
public string Filename { get; set; }
public int Size { get; set; }
}
var imageUnion = (from img in dc.ImageT1
select new TempImage() { Filename = img.filename, Size = img.size }).Union(
from img in dc.ImageT2
select new TempImage() { Filename = img.filename, Size = img.size });
Outras dicas
Você deve ser capaz de selecionar a partir de sua primeira consulta em vez da tabela de imagem novamente. Algo como:
var query = from image in imageUnion
join active in dc.ActiveImages on image.filename equals
active.filename into gj
from subimage in gj.DefaultIfEmpty()
where subimage.filename == null
select new { image.filename, image.size };
edit:. Você também vai ter que editar sua consulta imageUnion para selecionar (quaisquer outras colunas que você precisa em sua consulta final e), bem como o tamanho filename