gpt4 book ai didi

c# - 在 Entity Framework where 子句中比较字节数组

转载 作者:太空狗 更新时间:2023-10-30 01:19:22 25 4
gpt4 key购买 nike

是否可以使用 Entity Framework 比较 where 子句中的字节数组?

我有一个这样的字节列表:

List<byte[]> VisitorIDList

我需要像这样提取一些数据:

var VisitorList = context.Visitors
.Where(a => VisitorIDList.Contains(a.VisitorID))
.ToList();

VisitorID 字段被 EF 解释为 byte[]。我不能使用 SequenceEqual() 方法,因为它不会转换为 SQL,而且 Contains 不会匹配记录。那么我只是 SOL 就使用 EF 吗?

我知道我可以做这样的事情:

var VisitorList = context.Visitors
.ToList()
.Where(a => VisitorIDList.Any(b => b.SequenceEqual(a.VisitorID)))
.ToList();

但显然那是不切实际的。我正在使用 C#、.NET 4.5 和 EF 6。

最佳答案

当您按照您的描述调用 Contains 时, Entity Framework 表现出正确的行为。

给定一个实体:

public class Visitor
{
public int Id { get; set; }

[MaxLength(2)]
public byte[] VisitorId { get; set; }
}

以下 Linq to Entities 查询:

var visitorIdList = new byte[][]
{
new byte[] { 2, 2 },
new byte[] { 4, 4 },
}.ToList();

var visitors = context.Visitors
.Where(v => visitorIdList.Contains(v.VisitorId))
.ToList();

生成此 SQL(为了便于阅读而重新格式化):

SELECT 
[Extent1].[Id] AS [Id],
[Extent1].[VisitorId] AS [VisitorId]
FROM
[dbo].[Visitors] AS [Extent1]
WHERE
(
[Extent1].[VisitorId] IN ( 0x0202 , 0x0404 )
)
AND
(
[Extent1].[VisitorId] IS NOT NULL
)

您断言“VisitorID 字段被 EF 解释为 byte[]”。可能不正确。

值得注意的是, Entity Framework 将 c# 相等运算符转换为 SQL 相等运算符。这种行为可能有点出乎意料并造成困惑。

enter image description here

关于c# - 在 Entity Framework where 子句中比较字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23175762/

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