编译Linq& String.Contains

时间:2010-03-24 12:37:50

标签: .net linq linq-to-sql

我正在使用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修复它?

我收到此错误:

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

2 个答案:

答案 0 :(得分:8)

我面临同样的问题。我现在已经管理了这个问题的一个解决方法。而不是使用

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

我用过

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

答案 1 :(得分:0)

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

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