LINQ to SQL eseguendo un'unione e un join esterno sinistro
-
20-08-2019 - |
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!
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).