实体框架中的“ArrayIndex”在LINQ to Entities中不受支持。

5

在我的SQL Server数据库表中,我有一个binary列类型。

我无法执行查询,为什么?

var data = (from x in model.MyTable
            where x.BinaryColumn[0] == 1
            select x).FirstOrDefault();

我遇到了 The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities 错误。


BinaryColumn的类型是什么? - haim770
因为实体框架不知道如何将其翻译成TSQL。 - xanatos
haim770 >> 这是C#中的byte[]类型。 - Tony
这不是SQL服务器可以执行的计算类型;你唯一能做到的就是拉取整个表格,然后在客户端过滤表格,但这并不理想。这个查询的上下文是什么?也许有另一种方式来构建查询吗? - Claies
根据您使用实体框架的方式(edx文件,代码优先等),也许可以定义一个用户定义函数来返回标量(BinaryColumn的第一个字节)。在SQL中,您可以使用SUBSTRING(BinaryColumn, 1, 1)来检索它。 - xanatos
3个回答

4

这些表达式会被翻译成SQL查询,而这是你无法做到的事情。更多细节请查看此处


3
在 TSQL 中,SUBSTRING 函数可用于 binary/varbinary
某处定义:
[DbFunction("SqlServer", "SUBSTRING")]
public static byte[] SubString(byte[] field, int start, int length)
{
    throw new NotSupportedException("Direct calls are not supported.");
}

那么

var data = (from x in model.MyTable
            where Substring(x.BinaryColumn, 1, 1) == new byte[] { 1 }
            select x).FirstOrDefault();

1
如果您愿意稍微修改一下查询,这个方法就可以实现:
var data = (from x in model.MyTable
            where SqlFunctions.CharIndex(new byte[] { 1 }, x.BinaryColumn) == 1
            select x).FirstOrDefault();

请看

查看 MSDN


我认为它会返回1,而不是0,因为SQL从1开始计数。 - xanatos
@xanatos,已修复。谢谢。 - haim770

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接