2016-07-07 8 views
0

Ich versuche, eine LINQ-Abfrage an Entitäten zu erstellen, die einen linken Join verwenden, der nicht auf Gleichheit basiert, sondern EndsWith verwendet. Es funktioniert nicht wie beabsichtigt und ich frage mich, ob ich den Vergleich falsch mache. Wenn ich den Vergleich als eine Gleichheit mache, gibt es Ergebnisse zurück, aber eben nicht die Ergebnisse, die ich brauche, da ich die Ergebnisse mit EndsWith aufgrund der Eigenschaftswerte sehen muss.LINQ Left Join mit EndsWith anstelle von Equals

Basierend auf dem Code, den ich unten habe, soll ich ein resultierendes Objekt erhalten, das wie folgt aussieht:

X    Y 
BBFile1  File1 
XDDFile2  <Empty> 
File1TTFile3 File3 

Stattdessen bekomme ich nur einen Fehler, der besagt, dass „Objektverweis auf eine Instanz eines Objekts nicht festgelegt“ . Was ich gesucht habe und was ich gefunden habe, zeigte hauptsächlich auf die Tatsache, dass ich Standardwerte in der 'Select'-Anweisung setzen müsste, um anzuzeigen, was zu tun ist, wenn NULL-Ergebnisse zurückgegeben werden, aber ich tue das bereits und es scheint nicht arbeiten.

Hier ist der Code ich habe:

List<SFTPFilesListItem> SFTPFullNameList = new List<SFTPFilesListItem>(); 
     List<ArchiveFileListItem> ArchiveFilesList = new List<ArchiveFileListItem>(); 

     SFTPFilesListItem file = new SFTPFilesListItem(); 
     file.FullName = "BBFile1"; 
     SFTPFullNameList.Add(file); 

     SFTPFilesListItem file2 = new SFTPFilesListItem(); 
     file2.FullName = "XDDFile2"; 
     SFTPFullNameList.Add(file2); 

     SFTPFilesListItem file3 = new SFTPFilesListItem(); 
     file3.FullName = "File1TTFile3"; 
     SFTPFullNameList.Add(file3); 

     ArchiveFileListItem afile = new ArchiveFileListItem(); 
     afile.ArchiveFileName = "File3"; 
     ArchiveFilesList.Add(afile); 

     ArchiveFileListItem afile2 = new ArchiveFileListItem(); 
     afile2.ArchiveFileName = "File1"; 
     ArchiveFilesList.Add(afile2); 

     ArchiveFileListItem afile3 = new ArchiveFileListItem(); 
     afile3.ArchiveFileName = "File4"; 
     ArchiveFilesList.Add(afile3); 

     var oldfiles = from sftpfile in SFTPFullNameList 
         from archivefile in ArchiveFilesList 
         .Where(x => sftpfile.FullName.EndsWith(x.ArchiveFileName)) 
         .DefaultIfEmpty() 
         select new 
         { 
          x = sftpfile.FullName == null ? string.Empty : sftpfile.FullName, 
          y = archivefile.ArchiveFileName == null ? string.Empty : archivefile.ArchiveFileName 
         }; 

    } 

    public class SFTPFilesListItem 
    { 
     public string FullName { get; set; } 
    } 

    public class ArchiveFileListItem 
    { 
     public string ArchiveFileName { get; set; } 
    } 
+1

Haben Sie sich den generierten SQL angesehen? Dies erzeugt eine Kreuzverbindung, keine Linkverbindung. –

Antwort

0

Sie auf etwas anderes als eine Gleichheit nicht „join“: Sie erzeugen eine äußere Verknüpfung, dann wählen Sie die Zeilen, die Sie eine WHERE-Bedingung verwenden wollen (es ist lustig wie WHERE wählt, während SELECT Projekte, aber so ist es).

+0

Bruce, Können Sie anhand der von mir bereitgestellten Daten ein Beispiel dafür angeben, wie Sie den linken Join erreichen können? – silverbullettruck2001