Domanda

Ho 3 tavoli. 2 contengono elenchi di file su cui ho bisogno di fare UNION per ottenere tutti i file univoci, quindi voglio fare un join esterno sinistro contro la terza tabella per trovare tutti i file che sono solo nella terza tabella e non nell'altra 2.

Per fare l'UNIONE ho il seguente:

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

Ora, per ottenere i file solo nella terza tabella, farei un join esterno sinistro in quanto tale:

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

Capisco come eseguire il join esterno sinistro semplicemente contro UNA tabella, ma come posso ottenere il set di risultati della mia prima query nel join esterno sinistro? Fondamentalmente, invece di fare il join esterno sinistro contro ImagesT1 voglio farlo contro il risultato imageUnion.

Grazie!

È stato utile?

Soluzione

Devi selezionare più di una proprietà nella tua Unione; Il risultato corrente è IEnumerable & Lt; string & Gt; (supponendo che il tuo nome file sia una stringa).

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

Quindi dovresti essere in grado di usarlo nella seconda query per sostituire dc.ImageT1.

Pur riflettendo di più, l'Unione potrebbe non funzionare con 2 tipi anonimi; A supporto di ciò, forse varrebbe la pena definire una classe che ha solo un nome file e una dimensione?

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

Altri suggerimenti

Dovresti essere in grado di selezionare nuovamente dalla tua prima query invece che dalla tabella delle immagini. Qualcosa del tipo:

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

modifica: dovrai anche modificare la tua query imageUnion per selezionare la dimensione e il nome file (e qualsiasi altra colonna di cui hai bisogno nella tua query finale).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top