【问题标题】:LINQ Left Join with EndsWith instead of EqualsLINQ Left Join 使用 EndsWith 而不是 Equals
【发布时间】:2016-07-07 01:24:44
【问题描述】:

我正在尝试使用不基于相等性而是使用 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; }
    }

【问题讨论】:

  • 生成的sql看了吗?这将产生交叉连接,而不是左连接。

标签: c# linq linq-to-entities left-join ends-with


【解决方案1】:

除了等式之外,您不会“加入”任何东西:您生成一个外连接,然后使用 WHERE 条件选择您想要的行(有趣的是 WHERE 选择的方式,而 SELECT 项目,但就是这样) .

【讨论】:

  • Bruce,您能否举例说明如何使用我提供的数据完成左连接?
猜你喜欢
  • 2021-06-25
  • 2010-12-03
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多