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!

War es hilfreich?

Lösung

Sie müssen mehr als eine Eigenschaft in Ihrer Union wählen; Das aktuelle Ergebnis ist IEnumerable (vorausgesetzt, Ihr Dateiname ist ein 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 });

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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top