C# Linq查询中的表达式

C# Linq查询中的表达式,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我最近发现我不能从linq查询中调用任何方法。我试图编写一个查询,在where子句上比较两个字节数组。数据库上的值是Raw(32)类型的GUID,它以字节数组的形式返回。这是此表的记录ID。我需要将它与另一个字节数组进行比较。第二个字节数组可以转换为字符串,但由于无法从linq中调用方法,因此无法进行比较 我绑定了一个自定义的“比较”方法,还编写了一个扩展方法。All收到一个错误,指示“LINQ to Entities无法识别该方法” 下面是我正在尝试做的代码。where子句导致此错误: LIN

我最近发现我不能从linq查询中调用任何方法。我试图编写一个查询,在where子句上比较两个字节数组。数据库上的值是Raw(32)类型的GUID,它以字节数组的形式返回。这是此表的记录ID。我需要将它与另一个字节数组进行比较。第二个字节数组可以转换为字符串,但由于无法从linq中调用方法,因此无法进行比较

我绑定了一个自定义的“比较”方法,还编写了一个扩展方法。All收到一个错误,指示“LINQ to Entities无法识别该方法”

下面是我正在尝试做的代码。where子句导致此错误: LINQ to Entities无法识别方法“Boolean SequenceEqual[Byte](System.Collections.Generic.IEnumerable
1[System.Byte],System.Collections.Generic.IEnumerable
1[System.Byte]),此方法无法转换为存储表达式。”


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

var q = dbContex.EPSG_VSOREJECTS.
    .AsEnumerable()
    .Where(d => d.SDSRECID.SequenceEqual(byteArray));
这样做似乎会阻止EF尝试将
Where()
子句转换为SQL语法,但我不知道性能会受到什么影响

这也是使用方法语法,因为我不太熟悉查询语法.HTH

编辑:

正如其他一些人所指出的,您必须小心如何添加任何迭代方法(
AsEnumerable()
ToList()
,等等)由于超过了该点,您不再针对数据存储构建SQL。一旦您开始迭代,EF将执行到该点已构建的任何查询,从那时起,您将从LINQ查询中筛选结果集


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

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

var q = dbContext.EPSG_VSOREJECTS.FirstOrDefault(e => e.SDSRECID == byteArray);
类型为
byte[]
EPSGEntities
上的
SDSRECID
属性是否正确

这里的另一种选择是直接使用Sql获取对象。类似于:

dbContext.Database.SqlQuery<EPSG_VSOREJECT>("SELECT TOP 1 *" +
                                              "FROM dbo.EPSGEntities" +
                                              "WHERE SDSRECID = @byteString",
                                       new SqlParameter
                                       {    
                                         ParameterName = "byteString",
                                         Value = ViewState["itemID"].ToString(),
                                       }).FirstOrDefault();
dbContext.Database.SqlQuery(“选择前1个*”+
“来自dbo.Epsgenties”+
“其中SDSRECID=@byteString”,
新的SqlParameter
{    
ParameterName=“byteString”,
Value=ViewState[“itemID”]。ToString(),
}).FirstOrDefault();

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

你能不能先从DB加载,然后在本地副本上进行sequenceEqual比较?很清楚,你不能调用方法从
Linq到sql
,你可以使用JUlinq to Objects我希望避免将整个表存储到一个数据集/列表中,然后再进行查询。我希望从找到的linq queryi中得到一个结果,但不确定如何在这里应用linq to Entities无法运行C#代码。它需要能够将查询转换为SQL语句。因此,您需要重构,或者cre使用一个新方法返回一个执行所需操作的表达式。如果不确定要执行的操作,则执行此操作非常危险。所发生的情况是强制执行查询,检索
.AsEnumerable()之前的所有内容
调用,然后在内存中对其进行筛选。在某些情况下,这可能是执行所需操作的最简单、最好的方法,但在大多数情况下,将数据库表的全部内容选择到内存中并不是您真正想要做的事。
dbContext.Database.SqlQuery<EPSG_VSOREJECT>("SELECT TOP 1 *" +
                                              "FROM dbo.EPSGEntities" +
                                              "WHERE SDSRECID = @byteString",
                                       new SqlParameter
                                       {    
                                         ParameterName = "byteString",
                                         Value = ViewState["itemID"].ToString(),
                                       }).FirstOrDefault();