Pregunta

Tengo 3 mesas. 2 contienen listas de archivos en los que necesito hacer una UNIÓN para obtener todos los archivos únicos, luego quiero hacer una unión externa izquierda contra la tercera tabla para encontrar todos los archivos que están solo en la tercera tabla y no en la otra 2.

Para hacer UNION tengo lo siguiente:

var imageUnion = (from img in dc.ImageT1
                  select img.filename).Union(
                  from img in dc.ImageT2
                  select img.filename);

Ahora, para obtener los archivos solo en la tercera tabla, haría una combinación externa izquierda 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 };  

Entiendo cómo hacer la unión externa izquierda simplemente contra UNA tabla, pero ¿cómo obtengo el conjunto de resultados de mi primera consulta en la unión externa izquierda? Básicamente, en lugar de hacer la unión externa izquierda contra ImagesT1, quiero hacerlo contra el resultado de imageUnion.

¡Gracias!

¿Fue útil?

Solución

Debe seleccionar más de una propiedad en su Unión; El resultado actual es IEnumerable & Lt; string & Gt; (suponiendo que su nombre de archivo es una cadena).

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 });

Entonces debería poder usarlo en la segunda consulta para reemplazar dc.ImageT1.

Aunque pensando más en ello, la Unión puede no funcionar con 2 tipos anónimos; Para respaldar eso, ¿quizás valga la pena definir una clase que solo tenga un Nombre de archivo y Tamaño?

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 });

Otros consejos

Debería poder seleccionar desde su primera consulta en lugar de la tabla de imágenes nuevamente. Algo así 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 };

editar: también tendrá que editar su consulta imageUnion para seleccionar el tamaño y el nombre de archivo (y cualquier otra columna que necesite en su consulta final).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top