我正在尝试使用不基于相等而是使用 EndsWith 的左联接对实体进行 LINQ 查询。 它没有按预期工作,我想知道我是否进行了错误的比较。 当我将比较作为相等进行时,它会返回结果,但不是我需要的结果,因为由于属性值,我需要使用 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; }
}
除了相等之外,您不会"连接"任何其他内容:您生成一个外部连接,然后使用 WHERE 条件选择所需的行(WHERE 选择的方式很有趣,而 SELECT 项目,但事实就是这样)。