Linq查询中的表达式

时间:2013-04-26 15:53:54

标签: c# linq linq-to-sql

我最近发现我无法在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();

2 个答案:

答案 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可以代表您执行)。