实体框架不比较字节数组

问题描述 投票:0回答:2

我正在使用 EF 插入数据,其中包含 SHA512 哈希值。然后我像这样查找相同的数据,但没有返回结果:

var searchHash = requestToFind.GetSelfSha512Hash();
var foundRequest = _complianceContext.ScoreResults
    .Where(sr => sr.SearchHash == searchHash);

sr.SearchHash
searchHash
都是
byte[]

如果我去掉

Where
子句,我确实会得到 1 个结果。有什么想法吗?

c# entity-framework hash entity-framework-6
2个回答
8
投票

相等运算符的工作方式与您对字节数组的期望不同。尝试SequenceEqual

var foundRequest = _complianceContext.ScoreResults
  .Where(sr => sr.SequenceEqual(searchHash));

0
投票

这就是 EF 7 构建比较 byte[] 值的查询的方式:

  1. 声明了一个空方法,它接受两个字节数组并在我的上下文类中返回 bool:

public static bool LessThanOrEqual(byte[] a, byte[] b) { 抛出新的NotImplementedException(); }

  1. 在 OnConfiguring 中定义了从该函数到 SQL 树部分的转换: modelBuilder.HasDbFunction(

    typeof(DbContext).GetMethod(nameof(LessThanOrEqual), new[] { typeof(byte[]), typeof(byte[]) })) .HasTranslation( 参数=> 新的 SqlBinaryExpression( ExpressionType.LessThanOrEqual, 参数[0], 参数[1], args[0].类型, args[0].TypeMapping) );

  2. 在我的 Linq 查询中使用了此方法:

    字节[] arr = ... db.tbl.Where(r => DbContext.LessThanOrEqual(r.arr1, arr) && DbContext.LessThanOrEqual(arr, r.arr2))

  3. 此 Linq 查询生成以下 SQL 查询:

    选择... 从表格 哪里 (b.arr1 <= @__arr_0) AND (@__arr_0 <= b.arr2))

© www.soinside.com 2019 - 2024. All rights reserved.