2010-03-24 42 views
3

我正在使用Linq-to-SQL,并使用已编译的Linq来获得更好的性能。编译Linq&String.Contains

我有一个INT字段的用户表名为“LookingFor”,它可以具有下列值:1,2,3,12,123,13,23

我写了一个查询来返回基于“lookingFor”列的用户,并且我想返回包含“lookingFor”值的所有用户(不仅是那些等于它的人)。

例如,如果user.LookingFor = 12,并且查询参数是1,则应该选择该用户。

private static Func<NeDataContext, int, IQueryable<int>> 
     MainSearchQuery = CompiledQuery.Compile((NeDataContext db, int lookingFor) => 
     (from u in db.Users 
      where (lookingFor == -1 ? true : u.LookingFor.ToString().Contains(lookingFor)       
    select u.username); 

此工作对非编译的linq但在使用编译时引发错误。 如何使用编译的Linq修复它?

我得到这个错误:

,可以在客户端上进行评估

只有论据支持的String.Contains方法。

+0

什么是您会收到错误? – Rik 2010-03-24 12:50:30

+0

此外,编译的LinQ可能不如您想象的那么有益,请参阅:http://www.codinghorror.com/blog/2010/03/compiled-or-bust.html – Rik 2010-03-24 12:54:33

回答

0

您正在对无法转换为SQL的查找参数执行操作。我真的很惊讶,这不工作编译查询。

如果可能的话,我建议你改变你的数据库以使这个查询更容易。创建一个表来存储用户的LookingFor属性。或者,您可以将lookFor的数据类型更改为对数据库设计影响较小的字符串。

+0

如果我将数据类型更改为字符串,请问此在遵守linq工作?我只是没有看到它应该有所作为的原因。 – RuSh 2010-03-24 14:26:15

8

我正面临同样的问题。我已经为此问题设法解决了一个解决方法。除了使用

u.LookingFor.ToString().Contains(lookingFor) 

的我用

u.LookingFor.ToString().IndexOf(lookingFor) >= 0 
+1

我正在使用此解决方案,但是在大多数情况下,如果它位于字符串的开头,您可能需要> = 0,而不是> 0。 – kad81 2012-11-21 00:16:33