[英]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.