LINQ Left Соединяется с EndsWith вместо Equals

Я пытаюсь выполнить LINQ-запрос к сущностям, используя левое соединение, которое не основано на равенстве, а использует EndsWith. Это не работает, как задумано, и мне интересно, если я делаю сравнение неправильно. Когда я делаю сравнение как равенство, оно возвращает результаты, но не те, которые мне нужны, потому что мне нужно видеть результаты, используя EndsWith из-за значений свойств.

Основываясь на приведенном ниже коде, я должен получить результирующий объект, который выглядит следующим образом:

   X              Y
 BBFile1        File1
 XDDFile2       <Empty>
 File1TTFile3   File3

Вместо этого я просто получаю сообщение об ошибке, в котором говорится, что "Ссылка на объект не установлена ​​на экземпляр объекта". То, что я искал, и то, что я нашел, в основном указывало на тот факт, что мне нужно было бы установить значения по умолчанию в операторе "Выбор", чтобы указать, что делать, когда возвращаются результаты NULL, но я уже делаю это, и это не кажется работать.

Вот код, который у меня есть:

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 ответ

Вы не "соединяетесь" ни с чем, кроме равенства: вы генерируете внешнее соединение, а затем выбираете нужные строки, используя условие WHERE (забавно, как WHERE выбирает, тогда как SELECT проецирует, но так оно и есть).

Другие вопросы по тегам