【问题标题】:Compiled Linq & String.Contains编译的 Linq & String.Contains
【发布时间】:2010-03-24 12:37:50
【问题描述】:

我正在使用 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 方法仅支持可在客户端计算的参数。

【问题讨论】:

标签: .net linq linq-to-sql


【解决方案1】:

我也面临同样的问题。我现在只解决了这个问题的一种解决方法。而不是使用

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

我用过

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

【讨论】:

  • 我正在使用这个解决方案,但在大多数情况下,您可能希望 >= 0,而不是 > 0,以防它位于字符串的开头。
【解决方案2】:

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

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

【讨论】:

  • 如果我将数据类型更改为 string ,这将在编译的 linq 中工作吗?我只是不明白为什么它应该有所作为。
猜你喜欢
  • 2013-11-16
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2012-01-15
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多