2013-04-26 116 views
2

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

我绑定了一个自定义的“比较”方法,我也写了一个扩展方法。所有收到一个错误,指示“LINQ to Entities does not recognized the method”

这是我正在尝试做的代码。 where子句导致此错误: LINQ to Entities无法识别方法'Boolean SequenceEqual [Byte](System.Collections.Generic.IEnumerable 1[System.Byte], System.Collections.Generic.IEnumerable 1 [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(); 
+0

您可以先从数据库加载,然后对本地副本进行sequenceEqual比较吗? – Thewads 2013-04-26 15:55:43

+0

只是要清楚,你不能调用从'linq到sql'的方法,你可以只用linq到对象 – 2013-04-26 15:57:40

+0

我想避免将整个表存储到数据集/列表中,然后查询它。我希望从linq查询得到一个单一的结果 – user2275571 2013-04-26 16:47:24

回答

0

我不能完全肯定这工作,但我发现在IQueryable对象集调用.AsEnumerable()让我申请几乎我想任何代码:

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

这样做似乎阻止EF试图翻译Where()条款到SQL语法,但我不知道会有什么性能冲击。

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

编辑:

正如一些人指出的那样,你必须要小心你如何添加任何的迭代方法(AsEnumerable()ToList()等),因为过去你那点不再是构建SQL针对您的数据存储。一旦开始迭代,EF将执行到那时为止建立的任何查询,并从此开始过滤来自LINQ查询的结果集。

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

+0

如果你不确定你在做什么,这是非常危险的。会发生什么是你迫使查询执行,在'.AsEnumerable()'调用之前检索everyting,然后在内存中对其进行过滤。在某些情况下,这可能是最简单也是最好的方式来执行你想要的操作,但是在大多数情况下,将数据库表的全部内容选入内存并不是你想要做的。 – AHM 2013-11-18 15:40:43

1

您使用的是什么版本的EntityFramework?在EF6我可以简单地做一个varbinary列针对SQL 2012表如下:

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

byte[]类型的EPSGEntitiesSDSRECID财产?

这里的替代方法是直接使用Sql来获取对象。喜欢的东西:

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

LINQ到实体中EF是真棒大多数查询,但我有时会下降到SQL时,我需要做的事情不支持的,复杂的,或只是快。希望这可以帮助!