gpt4 book ai didi

c# - 比较 Linq 查询中的 byte[]

转载 作者:行者123 更新时间:2023-11-30 12:27:10 25 4
gpt4 key购买 nike

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

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

这很好用,因为 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 查询,使其在单元测试和查询数据库时都能正常工作?

我找到了一个很similar question但是 OP 通过更改他的查询(不幸的是这对我来说不是一个选项)而不是实际找到他原来问题的解决方案来解决他的问题。

最佳答案

您可以使用 Enumerable.SequenceEqual扩展方法:

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

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

关于c# - 比较 Linq 查询中的 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26345381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com