【问题标题】:Comparing two byte arrays in SQL Server比较 SQL Server 中的两个字节数组
【发布时间】:2020-12-03 07:46:00
【问题描述】:

我将byte[] 作为varbinary(64) 存储在SQL Server 数据库中,我需要使用输入byte[] 查找特定行。我正在使用实体框架来访问数据库,因此我可以像这样运行 linq 查询:

private MyTable GetMyTable(byte[] inputArray) 
{
   return _context.MyTable.FirstOrDefault(x => x.Hash.SequenceEqual(inputArray));
}

问题是SequenceEqual 无法转换为 SQL 查询,查询将在本地进行评估(这是不受欢迎的行为)。是否可以将SequenceEqual 替换为简单的比较运算符==?还是这种方法容易出错?还有比这更好的选择吗?

private MyTable GetMyTable(byte[] inputArray) 
{
   return _context.MyTable.FirstOrDefault(x => x.Hash == inputArray);
}

请注意,我的字节数组范围为 32 到 64 个字节,因此不会进行大量的数组比较。

【问题讨论】:

  • 你可以使用 Array.Equals(object, object)
  • 实际上,在这种情况下使用 Array.Equals 似乎比 == 更“正确”。非常感谢@jdweng​​span>

标签: c# sql-server compare


【解决方案1】:

是否可以将 SequenceEqual 替换为简单的比较运算符 ==?

可能是的,这将被翻译为 SQL

  SELECT ...
  FROM [MyTable] AS [c]
  WHERE [c].[Hash] = @__inputArray_0

并且= 在 SQL Server for binary/varbinary 中对值执行逐字节二进制比较,忽略尾随的 0。因此,如果这是您想要的比较,那么您就可以开始了。

【讨论】:

  • 我测试了这两种方法,== 和 Array.Equals 正如@jdweng 建议的那样,它们似乎都转换为这个。我只是想确定一下。感谢您的帮助!
猜你喜欢
  • 2010-09-07
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多