比较实体框架中的字节数组 where 子句

Ric*_*tts 5 c# entity-framework entity-framework-6

是否可以使用实体框架比较 where 子句中的字节数组?

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

List<byte[]> VisitorIDList
Run Code Online (Sandbox Code Playgroud)

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

var VisitorList = context.Visitors
     .Where(a => VisitorIDList.Contains(a.VisitorID))
     .ToList();
Run Code Online (Sandbox Code Playgroud)

VisitorID字段被byte[]EF解释为 a 。我不能使用该SequenceEqual()方法,因为它不会转换为 SQL 并且Contains不会匹配记录。所以我只是为此使用 EF 的 SOL 吗?

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

var VisitorList = context.Visitors
     .ToList()
     .Where(a => VisitorIDList.Any(b => b.SequenceEqual(a.VisitorID)))
     .ToList();
Run Code Online (Sandbox Code Playgroud)

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

rte*_*tev 5

当您按照您的描述调用 Contains 时,实体框架表现出正确的行为。

给定一个实体:

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

    [MaxLength(2)]
    public byte[] VisitorId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以下 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();
Run Code Online (Sandbox Code Playgroud)

生成此 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
    )
Run Code Online (Sandbox Code Playgroud)

您断言“访问者 ID 字段被 EF 解释为字节 []”。可能不正确。

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

在此处输入图片说明