我必须在sql server 2005的表中保存大量文件的信息。
我将每个文件的完整md5存储为sql上的varbinary,.net数据库实体框架将其抽象为byte[]数组。很公平。
我正在使用这样的查询查询上述表,比较哈希值以检查数据库中是否已存在文件:
byte[] hash = inputfile.GetFileMD5();
var query = context.CurveData
.Where(n => n.MD5.Equals(hash))
.Select(n => n.MD5)
.DefaultIfEmpty(null).FirstOrDefault();
不能将数组与.equals()进行比较,因为它比较的是实例,而不是序列。必须使用.SequenceEqual();但是,查询运行得非常好。如果我保存一个文件并对其运行查询,我确实可以从数据库中获得正确的哈希值;许多其他文件也可以正常工作。
两个问题:
怎么可能呢?是否存在检查数组相等性的.equals()重载?
如何使用.sequenceequal()实现上述查询?如果我试图用.sequenceequal()替换.equals(),则会出现异常
linq to entities无法识别“boolean sequenceequal[byte]方法(system.collections.generic.IEnumerable
1[System.Byte], System.Collections.Generic.IEnumerable
1[system.byte])”谢谢!
最佳答案
该查询中的代码不是作为C代码运行的。它只是被编译成描述代码的Expression
对象,而不是被转换成最终可用于执行代码的il代码。然后,查询提供程序可以查看那些Expression
对象来查看您编写的内容,并对这些信息执行……任何操作。在这种特殊情况下,它最终将代码转换为sql并执行数据库查询。查询提供程序知道如何将这两个字节数组的Equals
调用转换为正确的sql来比较这两个数组。它不是为了理解SequenceEqual
方法而设计的;它不知道如何将其转换为sql,所以它只是错误。
不能用SequenceEqual
实现该查询。您可以尝试说服查询提供程序的作者支持它,也可以使用SequenceEqual
,然后尝试转换创建的Expression
,以便所有SequenceEqual
调用都变为Equals
调用,但这将是一项繁重的工作,而且我看不到它有任何成效。