Ric*_*tts 5 c# entity-framework entity-framework-6
是否可以使用实体框架比较 where 子句中的字节数组?
我有一个这样的字节列表:
List<byte[]> VisitorIDList
我需要提取一些这样的数据:
var VisitorList = context.Visitors
     .Where(a => VisitorIDList.Contains(a.VisitorID))
     .ToList();
该VisitorID字段被byte[]EF解释为 a 。我不能使用该SequenceEqual()方法,因为它不会转换为 SQL 并且Contains不会匹配记录。所以我只是为此使用 EF 的 SOL 吗?
我知道我可以做这样的事情:
var VisitorList = context.Visitors
     .ToList()
     .Where(a => VisitorIDList.Any(b => b.SequenceEqual(a.VisitorID)))
     .ToList();
但显然这是不切实际的。我正在使用 C#、.NET 4.5 和 EF 6。
当您按照您的描述调用 Contains 时,实体框架表现出正确的行为。
给定一个实体:
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
    )
您断言“访问者 ID 字段被 EF 解释为字节 []”。可能不正确。
值得注意的是,Entity 框架将 c# 相等运算符转换为 SQL Equals 运算符。这种行为可能有点出乎意料并造成混乱。
