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!

Foi útil?

Solução

Você precisa selecionar mais de uma propriedade em sua União; O resultado atual é IEnumerable (assumindo que o seu nome é uma string).

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top