已编译的Linq和String.Contains

3
我正在使用 Linq-to-SQL,并使用编译的 Linq 以获得更好的性能。
我有一个名为“LookingFor”的 INT 字段的用户表,可以具有以下值: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时会抛出错误。

我该如何使用编译的Linq来解决这个问题呢?

我得到了以下错误提示:

仅支持在客户端上可以评估的参数用于String.Contains方法。


你收到了什么错误? - Rik
此外,编译的 LinQ 可能比你想象的 less 有益,请参见:http://www.codinghorror.com/blog/2010/03/compiled-or-bust.html - Rik
2个回答

8

我也遇到了同样的问题。目前我只找到了一种解决方法。不使用

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

我使用过

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

1
我正在使用这个解决方案,但在大多数情况下,如果它位于字符串的开头,你可能想要使用>= 0而不是> 0。 - kad81

0
您正在对lookingFor参数执行不能转换为SQL的操作。我很惊讶在不编译查询时这个操作能够正常工作。
如果可能的话,我建议您更改数据库以使此查询更容易。创建一个表来存储用户的LookingFor属性。或者您可以将lookingFor的数据类型更改为字符串,这对数据库设计的影响较小。

如果我将数据类型更改为字符串,这在编译后的Linq中能正常工作吗?我只是不明白为什么会有所不同。 - RuSh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接