如何让 LINQ 全外连接正常运行?

2024-01-03

我正在构建一个 WPF 应用程序来监视用户计算机上的目录。该应用程序从受监控的目录上传文件,然后将一些信息保存到 SQLite 数据库中。部分业务处理是对已经上传的文件不重新处理,对已经上传但自上次上传后发生变化的文件重新上传。

我有两个构建并返回一个辅助方法List<FileMetaData>我用过的LINQ - 完全外连接 https://stackoverflow.com/questions/5489987/linq-full-outer-join加入.我的问题是,当我使用我的代码时,代码似乎不起作用FileMetaData目的。似乎一切都应该有效,但我不知道为什么它不起作用。我通常会尝试在其他线程上发表评论,但目前我没有“代表”来执行此操作。

下面是我构建的一个示例,如果您运行它,它会显示我的问题LINQpad http://www.linqpad.net/。在单击运行按钮之前,请确保将语言设置为“C# 程序”。我应该采取什么不同的措施才能使样本与对象一起工作?万分感谢!

    void Main()
    {
        var dbItems = new List<FileMetaData>() { 
                new FileMetaData {FilePath = "C:\\Foo.txt", DbTimestamp = "1" },
                new FileMetaData {FilePath = "C:\\FooBar.txt", DbTimestamp = "3" },
            };

        var fsItems = new List<FileMetaData>() {
                new FileMetaData {FilePath = "C:\\Bar.txt", FsTimestamp = "2" },
                new FileMetaData {FilePath = "C:\\FooBar.txt", FsTimestamp = "3" },
            };

            var leftOuter = from d in dbItems
                    join f in fsItems on d.FilePath equals f.FilePath
                    into temp
                    from o in temp.DefaultIfEmpty(new FileMetaData(){})
                    select new FileMetaData { 
                        FilePath = d.FilePath, 
                        DbTimestamp = d.DbTimestamp,
                        FsTimestamp = o.FsTimestamp,
                    };

            var rightOuter = from f in fsItems
                    join d in dbItems on f.FilePath equals d.FilePath
                    into temp
                    from o in temp.DefaultIfEmpty(new FileMetaData(){})
                    select new FileMetaData { 
                        FilePath = f.FilePath, 
                        DbTimestamp = o.DbTimestamp,
                        FsTimestamp = f.FsTimestamp,
                    };

            var full = leftOuter.AsEnumerable().Union(rightOuter.AsEnumerable());

            leftOuter.Dump("Left Results");
            rightOuter.Dump("Right Results");

            full.Dump("Full Results");
    }

    // Define other methods and classes here
    public class FileMetaData
    {
        public string FilePath;
        public string DbTimestamp;
        public string FsTimestamp;
    }

EDIT:

下面的答案正是我正在寻找的。我实施了IEqualityComparer如下定义并将我的电话更改为var full = leftOuter.Union(rightOuter, new FileMetaDataCompare())...

    public class FileMetaDataCompare : IEqualityComparer<FileMetaData>
    {
        public bool Equals(FileMetaData x, FileMetaData y)
        {
            var areEqual = x.FilePath == y.FilePath;
            areEqual = areEqual && x.DbTimestamp == y.DbTimestamp;
            areEqual = areEqual && x.FsTimestamp == y.FsTimestamp;

            return areEqual;
        }

        public int GetHashCode(FileMetaData obj)
        {
            var hCode = string.Concat(obj.FilePath, obj.DbTimestamp, obj.FsTimestamp);
            return hCode.GetHashCode();
        }
    }

问题是Union会给你结果消除重复项通过检查是否相等。当您使用匿名类型时,相等的定义是“所有字段具有相等的值”。当你声明一个类型时,它将使用Equals方法。既然你还没有覆盖Equals,默认为ReferenceEquals,这意味着两个单独的实例不相等,无论其字段值如何。

解决这个问题的三种方法:

1) 在查询中使用匿名类型并在 Union 后转换为定义类型:

var full = leftOuter.Union(rightOuter).Select(
    i=> new FileMetaData {
        FilePath = i.FilePath,
        DbTimestamp = i.DbTimestamp,
        FsTimestamp = i.FsTimestamp
    });

2)定义一个IEqualityComparer<FileMetaData>定义您想要的相等性的类(只是 FilePath?所有字段?)并将其实例传递给Union()

3) 覆盖Equals() (and GetHashCode()) in FileMetaData.

2) 和 3) 非常相似,但最重要Equals()每当您检查相等性时都可以(并且将会)使用,而不仅仅是在这种情况下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 LINQ 全外连接正常运行? 的相关文章

随机推荐

  • Behat/Mink 无法模拟点击页脚中的按钮[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 尝试对页脚中的项目使用 然后我按 对
  • Heroku 陷入为 NodeJs 应用程序构建源代码的困境

    当我尝试在 heroku 上部署我的应用程序时 它陷入了远程 构建源 一开始以为是网络问题 换了网络 但是问题依旧 我也尝试过强制推送 也没用 Counting objects 100 19 19 done Delta compressio
  • Windows光标最大尺寸

    我有一个大小为 128x128 的光标 但是当我使用 LoadCursor 加载并显示它时 它只有 32x32 哪个API可以正确实现 MS 似乎调整了它的大小 谢谢 Windows XP 不包含任何大于 32x32 的系统光标 如果包含较
  • 更改 github 帐户 mac 命令行

    我有两个 github 帐户 一个用于工作 一个用于家庭 我正在处理一个个人项目 无法推送到 origin master 因为它说我仍然登录到我的工作帐户 我重置了我的全局用户 user name user email user token
  • React Admin - 如何使用 abc/def 等嵌套路径调用 dataProvider

    React admin 的Resource组件图name端点的 prop 值 例如 访问数据 http example com abc your Resource组件看起来像这样
  • Jasper 报告 HTML 组件

    我设计了一个简单的报告 将 HTML 调色板放入其中 iFrame 当我运行报告时 我收到此异常 java lang ClassNotFoundException net sf jasperreports components html H
  • 将 apache-spark 日志记录发送到 Amazon EMR 集群上的 redis/logstash 的最佳方法 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 Amazon EMR 集群上触发提交作业 我希望将所有 Spark 日志记录发送到 redis logstash 在 EMR 下配置
  • Pandas 将用户代理列解析为多列

    我有一个 http 请求日志的数据框 唯一相关的列是我正在尝试解析的 userAgent 列 我正在使用 ua parser 这会将每个 userAgent 变成一个嵌套字典 如下所示 gt gt gt from ua parser imp
  • 如何在 MIPS 汇编中找到没有除法或模运算符的余数

    我想找到一种方法来知道一个整数是除以3还是7而不使用除法 因为它在MIPS汇编中非常慢 我做了很多研究但一无所获 有一种方法描述为格兰隆德和蒙哥马利 https gmplib org tege divcnst pldi94 pdf需要 奇
  • 如何将依赖子查询转换为联接以获得更好的性能?

    我有一个存储 主题 的数据库 每个主题都与一大堆图像相关联 这些主题的屏幕截图 现在我想显示最新的 10 个主题 对于每个主题 我只想从数据库中获取一张图像 ID 最低的图像 目前我的查询如下所示 我正在使用子查询 SELECT DISTI
  • ListPopupWindow 不遵守 WRAP_CONTENT 宽度规范

    我正在尝试使用 ListPopupWindow 通过ArrayAdapter 最终这将是一个更复杂的自定义适配器 代码如下 如截图所示 得到的结果ListPopupWindow看起来就像内容宽度为零一样 它显示了正确的项目数量 这些项目仍然
  • HighCharts - 将系列与值而不是百分比进行比较

    只需一个简单的答案 是否有一种简单的方法可以比较一系列值而不是百分比 像 比较 值 而不是 比较 百分比 之类的东西 或者我是否必须手动添加给定时间间隔的数据点 谢谢 是的 但该选项称为value 来自绘图选项 系列 比较 http api
  • 会话重放、会话固定、会话劫持

    谁能明确区分会话固定 会话重放和会话劫持攻击吗 我读了很多文章 但会话劫持和会话重放攻击之间的问题仍然不清楚 固定和劫持最终都有相同的目标 获得会话的访问权限 它们的区别仅在于实现这一目标的方式不同 会话劫持的行为很简单stealing现有
  • Jekyll:javascript 中的液体标签

    假设我有两个链接 所有帖子 和 个人 当用户单击 个人 链接时 他应该只能看到类别为 个人 的帖子 现在 液体标签是 for post in site posts 我想了解是否有办法访问该变量site posts来自 javascript
  • 构造函数内的 Try/catch 块

    在构造函数中使用 try catch 块是一种不好的编程习惯吗 或者只要我们的程序优雅地处理类型初始化器异常就没有什么区别 在 C 中 如果构造函数内有任何异常 框架总是会抛出 typeinitilizer 异常 谢谢 沙米卡 System
  • 随机化数组的有效方法 - Shuffle 代码

    我在面试中被问到这个问题 我给出了各种解决方案 但面试官并不相信 我有兴趣找到解决方案 请提出您的看法 问 编写一个高效的数据结构来实现 ipod 中的 shuffle 它必须播放所有歌曲 每次以不同的随机顺序播放 同一首歌曲不应重复 大部
  • 将 GitLab CI 变量写入文件

    我如何将 GitLab CI 变量写入配置文件 如下所示 test stage test script touch config json echo database DB NAME gt gt config json 变量无法解决 我总是
  • 如何在 Mac 10.8.3 上安装 qpdf?

    跑步时R CMD check在 Mac 构建服务器上的包上 我收到警告 qpdf is needed for checks on size reduction of PDFs 我似乎无法得到qpdf http sourceforge net
  • 自定义 SQL GROUP BY 子句

    我有一个非常定制的 SQL 查询 但在实现时遇到问题 我正在使用 SQL Server 2008 我在此查询中只有一张表 但我正在寻找非常具体的数据 该查询的要求是 对于每个不同的 PartNumber 列 我需要选择要选择的最新 最大 P
  • 如何让 LINQ 全外连接正常运行?

    我正在构建一个 WPF 应用程序来监视用户计算机上的目录 该应用程序从受监控的目录上传文件 然后将一些信息保存到 SQLite 数据库中 部分业务处理是对已经上传的文件不重新处理 对已经上传但自上次上传后发生变化的文件重新上传 我有两个构建