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。
当您按照您的描述调用 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 运算符。这种行为可能有点出乎意料并造成混乱。

| 归档时间: |
|
| 查看次数: |
3462 次 |
| 最近记录: |