在 Linq 查询中比较 byte[]

2023-12-31

我的 SQL 表中有一个二进制列,我使用以下 C# 代码成功查询了该表:

var hash = "http://www.whatever.com".ToSHA256HashBytes();
var landingPage = context.LandingPages.FirstOrDefault(lp => lp.UrlHash == hash);
  • 请注意:“ToSHA256HashBytes”是我编写的一个扩展方法,它返回一个 byte[]

这非常有效,因为 SQL 将比较 byte[] 的内容并返回与匹配“UrlHash”的记录。

但是,这在我的单元测试中不起作用,因为比较是在内存中执行的,并且比较 byte[] 的规则显然是不同的。如果两个字节数组位于内存中的同一位置,而不是通过比较数组的内容,C# 似乎会认为它们相等。

这意味着下面的单元测试将失败

var data = new[]
{
    new LandingPage() { UrlHash = "http://www.whatever.com".ToSHA256HashBytes() },
    new LandingPage() { UrlHash = "http://mycompany.com/another/folder/page.php"".ToSHA256HashBytes() },
    new LandingPage() { UrlHash = "http://someothercompany.com/folder/somepage.html"".ToSHA256HashBytes() }
};
var mockData = new Mock<DbSet<T>>();
var queryableData = data.AsQueryable();
mockData.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryableData.Provider);
mockData.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryableData.Expression);
mockData.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryableData.ElementType);
mockData.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(queryableData.GetEnumerator());

var mockContext = new Mock<MyContext>();
mockContext.Setup(m => m.LandingPages).Returns(mockData.Object);

var hash = "http://www.whatever.com".ToSHA256HashBytes();
var landingPage = mockContext.Object.LandingPages.FirstOrDefault(lp => lp.UrlHash == hash);
Assert.IsNotNull(landingPage);

有没有一种方法可以编写 Linq 查询,以便它在单元测试和查询数据库时都可以工作?

我发现了一个非常类似的问题 https://stackoverflow.com/questions/3744031/comparing-byte-in-linq-to-sql-and-in-a-unit-test-that-uses-mocking但OP通过更改他的查询来解决他的问题(不幸的是,这对我来说不是一个选择),而不是真正找到他原来问题的解决方案。


您可以使用Enumerable.SequenceEqual http://msdn.microsoft.com/en-us/library/vstudio/bb348567(v=vs.100).aspx扩展方法:

var landingPage = context.LandingPages
    .FirstOrDefault(lp => lp.UrlHash.SequenceEqual(hash));

返回值SequenceEqual is true当且仅当两个源序列长度相等,并且根据其类型的默认相等比较器,它们对应的元素相等。

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

在 Linq 查询中比较 byte[] 的相关文章

随机推荐

  • Rails 4 devise_invitable 邀请令牌无效

    我一直在关注Ryan Boland 的优秀 Rails 多租户教程 https www youtube com watch v nXqwFEjxyhM 但遇到了 devise invitable 的问题 我在用 Rails 4 1 5 de
  • 如何 IKVM Apache POI

    我想在我的 NET 应用程序中使用 Apache POI 我知道有一个端口 NPOI 但它不完整并且没有 PowerPoint 相关功能 我尝试使用以下命令对其进行 IKVM ikvmc target library poi 3 8 jar
  • biblatex:自定义参考书目条目

    我目前正在努力处理我的 BibLaTeX 文件 我想把这两个信息变成粗体 我正在使用下面的模板 但找不到插入的正确位置textbf or a 马克比博尔德属性 甚至不知道在这个用例中这是否是正确的属性 每次尝试都失败和 或使我的整个项目崩溃
  • Django 多对多限制

    我是数据库和 Django 的新手 我对触发器了解甚少 我创建了一个关于学术专家系统的数据库 这里所有论文最多应有 4 个主题 如果选择的主题多于 则应发出 主题过多 的警告 一个主题可以由许多论文拥有 所以这是一种多对四的关系 但我不知道
  • 如何从 C# 代码调用 Google 地理编码服务

    我有一个 C 类库 从那里我必须调用谷歌服务并获取纬度和经度 我知道如何在页面上使用 AJAX 来完成此操作 但我想直接从我的 C 类文件调用 Google 地理编码服务 有什么方法可以做到这一点 或者我可以使用任何其他服务来实现此目的 你
  • 用 Haskell 编写 Zipwith

    我正在尝试写ZipwithHaskell 中的函数 如果我使用以下值运行它 它应该返回以下结果 Prelude gt zipWith 10 20 30 33 44 94 43 64 124 到目前为止我的代码是 Zipwith f Zipw
  • Google 电子表格“无法调用 null 的方法“getRange””

    如果 B 列从第六行开始的每一行都发生了变化 我想在 A 列中生成一个唯一的 ID 使用 1 到 X 之间的数字作为 ID 就足够了 但在移动 de row 后它不应该改变 但我不断收到错误 无法调用 null 的方法 getRange f
  • 使用所有插件引导新的 Eclipse 机器

    在新机器上引导 Eclipse 是一个非常耗时的过程 您最终会问自己是否真的需要每个插件 但这一切都很方便 并且有助于养成一致的习惯 Eclipse 引导问题包括 解释 记录需要发生的事情 粘贴正确的 URL 并下载的实际时间 版本兼容性和
  • Linux:信号处理程序执行可以被抢占吗?

    我遇到了以下信号处理程序代码 它存储 errno 变量 以便它不会影响主线程的 errno 处理 void myhandler int signo int esaved esaved errno write STDOUT FILENO Go
  • python程序错误elif else if [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions def G
  • 如何在 JavaScript 中找到整数的质因数?

    我试图找到一个数字的质因数 在下面使用 JavaScript 中的 for 循环记录为 整数 我似乎无法让它工作 我不确定这是我的 JavaScript 还是我的计算逻辑 integer is the value for which we
  • Haskell:如何将 IO 输入字符串解析为 Float(或 Int 或其他)?

    我正在尝试制作一个程序 该程序接受用户通过键盘输入的浮点数字并对其进行处理 然而 每次我尝试将输入的字符串解析为浮点数时 我都会收到错误 我尝试过的每一种方法都无法让我获取用户输入的数据并将其转换为我需要的浮点数 我的练习计划 不是我要解决
  • 泰坦数据损坏

    我在调用时遇到异常com tinkerpop blueprints Edge getLabel在某些顶点边上 java lang IllegalStateException Could not find type for id 630 at
  • 填充 int 数组从零到定义的数字

    我需要将 C 中的 int 数组从零填充到变量定义的数字 但 ISO C 禁止可变长度数组 如何轻松填充数组 我需要分配 释放内存吗 int possibilities SIZE unsigned int i 0 for i 0 i lt
  • wix 安装程序ice03 无效语言 ID

    我有一个夜间版本 它在与我的不同的机器上运行在我的机器上 我可以毫无问题地编译安装程序并使用 msi然而在晚上构建机器时我得到 C Builds 73 Tools AppInstaller src AppInstaller APPExpor
  • Python - 无限 While 循环

    我不明白为什么底部的 while 循环是无限循环 User enters a positive integer number user input int input Please enter a positive integer numb
  • Swing 中的交互式平面直线图

    我正在尝试在 JApplet 上绘制交互式平面直线图 PSLG 我使用鼠标单击来确定 PSLG 的顶点 这是我用来绘制 PSLG 边缘的算法 1 将用户执行鼠标单击的点添加为 PSLG 的顶点 2 如果他单击第二个点 则该点和先前单击的点之
  • Crockford 风格的上下文着色是否在任何代码编辑器中实现?

    我观看了 YUIConf 2012 的视频 其中 Douglas Crockford 发表了有关在 JavaScript 中实现 monad 的演讲 在本次演讲中 他给出了一个代码示例 该示例利用了他所谓的 上下文着色 它抛弃了按语言语法着
  • 为什么具有 UNC 路径的 .NET 的 File.Open 会进行过多的 SMB 调用?

    我有一段代码需要使用 UNC 路径从 NAS 服务器打开并读取大量小文本文件 此代码是最初用 C 编写的模块的一部分 但现在正在转换为 C C 版本明显慢一些 我确定打开文件的调用几乎是所有性能差异的原因 使用 WireShark 我发现这
  • 在 Linq 查询中比较 byte[]

    我的 SQL 表中有一个二进制列 我使用以下 C 代码成功查询了该表 var hash http www whatever com ToSHA256HashBytes var landingPage context LandingPages