LINQ to SQL tun eine Union und Left Outer Join
-
20-08-2019 - |
Frage
Ich habe 3 Tabellen. 2 enthalten Listen von Dateien, die ich brauche eine UNION zu tun auf alle einzigartigen Dateien zu bekommen, dann möchte ich eine linke äußere Verknüpfung gegen die dritte Tabelle tun, um alle Dateien zu finden, die in der dritten Tabelle sind nur und nicht in der anderen 2.
die Union tun Ich habe folgende:
var imageUnion = (from img in dc.ImageT1
select img.filename).Union(
from img in dc.ImageT2
select img.filename);
Nun, um die Dateien zu bekommen nur in der dritten Tabelle würde ich eine linke äußere trete als solche:
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 };
Ich verstehe, wie die linke Außen zu tun kommen einfach gegen einen Tisch, aber wie bekomme ich das Ergebnis Satz meiner ersten Abfrage in die linke äußere Verknüpfung? Grundsätzlich statt der linken Außen tun beitreten gegen ImagesT1 ich es gegen das imageUnion Ergebnis tun wollen.
Danke!
Lösung
Sie müssen mehr als eine Eigenschaft in Ihrer Union wählen; Das aktuelle Ergebnis ist 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 });
Dann sollten Sie in der Lage sein, es in der zweiten Abfrage zu verwenden dc.ImageT1 zu ersetzen.
Obwohl mehr auf sie denken, kann die Union nicht mit zwei anonymen Typen arbeiten; Zu unterstützen, dass, vielleicht würde es sich lohnen, eine Klasse zu definieren, die nur einen Dateiname und Größe hat?
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 });
Andere Tipps
Es soll möglich sein, von Ihrer ersten Abfrage erneut anstelle der Bildtabelle auszuwählen. So etwas wie:
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 };
bearbeiten. Sie werden auch Ihre imageUnion Abfrage haben, bearbeiten Größe sowie Dateinamen auswählen (und alle anderen Spalten, die Sie in Ihrem letzten Abfrage benötigen)