簡體   English   中英

比較Entity Framework where子句中的字節數組

[英]Comparing byte array in Entity Framework where clause

是否可以使用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框架將c#相等運算符轉換為SQL Equals運算符。 這種行為可能有點出乎意料並造成混淆。

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM