2

我最近发现我无法从 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.IEnumerable1[System.Byte])' 方法,并且此方法无法转换为存储表达式。 "

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();
4

2 回答 2

1

你用的是什么版本的EntityFramework?在 EF6 上,我可以简单地对带有varbinary列的 SQL 2012 表执行以下操作:

var q = dbContext.EPSG_VSOREJECTS.FirstOrDefault(e => e.SDSRECID == byteArray);

SDSRECID属性EPSGEntities是类型吗byte[]

这里的替代方法是直接使用 Sql 来获取您的对象。就像是:

dbContext.Database.SqlQuery<EPSG_VSOREJECT>("SELECT TOP 1 *" +
                                              "FROM dbo.EPSGEntities" +
                                              "WHERE SDSRECID = @byteString",
                                       new SqlParameter
                                       {    
                                         ParameterName = "byteString",
                                         Value = ViewState["itemID"].ToString(),
                                       }).FirstOrDefault();

EF 中的 Linq to Entities 对于大多数查询来说都很棒,但是当我需要做一些不受支持、复杂或只是快速的事情时,我有时会使用 sql。希望这可以帮助!

于 2013-11-20T05:06:20.390 回答
0

我不完全确定这是否有效,但我发现调用.AsEnumerable()对象IQueryable集可以让我应用几乎任何我希望的代码:

var q = dbContex.EPSG_VSOREJECTS.
    .AsEnumerable()
    .Where(d => d.SDSRECID.SequenceEqual(byteArray));

这样做似乎可以防止 EF 尝试将Where()子句转换为 SQL 语法,但我不知道性能会受到什么影响。

这也是使用方法语法,因为我对查询语法并不熟悉。HTH。

编辑:

正如其他一些人所指出的,您必须小心添加任何迭代方法(AsEnumerable()ToList()等),因为在此之后,您不再针对数据存储构建 SQL。开始迭代后,EF 将执行到目前为止已构建的任何查询,然后从 LINQ 查询中过滤结果集。

在这种情况下,我不知道这可以避免,除非有人可以构建与存储过程相同的查询(EF 可以代表您执行)。

于 2013-04-27T16:58:05.637 回答