我最近发现我无法在linq查询中调用任何方法。我正在尝试编写一个查询,在where子句上比较两个字节数组。数据库上的值是Raw(32)类型的GUID,它作为字节数组返回。这是此表的记录ID。我需要将它与另一个字节数组进行比较。第二个字节数组可以转换为字符串但由于我无法从linq中调用方法,因此无法进行比较。
我绑定了一个自定义的“比较”方法,我还写了一个扩展方法。全部收到错误,指示“LINQ to Entities无法识别方法”
这是我想要做的代码。 where子句导致此错误:
LINQ to Entities无法识别方法'Boolean SequenceEqual [Byte](System.Collections.Generic.IEnumerable 1[System.Byte], System.Collections.Generic.IEnumerable
1 [System.Byte])'方法,并且此方法无法转换为商店表达式。“< / p>
EPSGEntities dbContex = new EPSGEntities();
byte[] byteArray = ParseHex(ViewState["itemID"].ToString());
var q = (from d in dbContex.EPSG_VSOREJECTS
where d.SDSRECID.SequenceEqual(byteArray)
select d).First();
答案 0 :(得分:1)
您使用的是什么版本的EntityFramework
?在EF6上,我可以针对带有varbinary
列的SQL 2012表执行以下操作:
var q = dbContext.EPSG_VSOREJECTS.FirstOrDefault(e => e.SDSRECID == byteArray);
SDSRECID
类型为EPSGEntities
的{{1}}属性?
这里的替代方案是直接使用Sql来获取对象。类似的东西:
byte[]
对于大多数查询来说,Linq to EF中的实体非常棒,但是当我需要做一些不受支持,复杂或快速的事情时,我有时会掉进sql。希望这有帮助!
答案 1 :(得分:0)
我不完全确定这是有效的,但我发现在.AsEnumerable()
对象集上调用IQueryable
让我可以应用我想要的任何代码:
var q = dbContex.EPSG_VSOREJECTS.
.AsEnumerable()
.Where(d => d.SDSRECID.SequenceEqual(byteArray));
这样做似乎阻止了EF尝试将Where()
子句转换为SQL语法,但我不知道性能将会/将会是什么。
这也是使用方法语法,因为我并不熟悉查询语法。 HTH。
修改强>
正如其他一些人所说,你必须小心添加任何迭代方法(AsEnumerable()
,ToList()
等),因为在那之后你不再需要构建SQL你的数据存储。一旦开始迭代,EF将执行到此为止构建的任何查询,从那时起,您将从LINQ查询中过滤结果集。
在这种情况下,我不知道这是可以避免的,除非有人可以构建与sproc相同的查询(EF可以代表您执行)。