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 проецирует, но так оно и есть).