在Linq查询中使用contains会产生错误

时间:2013-07-13 17:41:26

标签: vb.net linq-to-sql

我有一个很直接的查询,它在运行时产生这个错误:String.Contains方法只支持可以在客户端上计算的参数。

该查询应该只查找分配了转移的类别。传输可以列在几个类别中,因此没有表关系。 Categoryidhash包含“7~34~25~42~47”等数据。我在写这篇文章时意识到搜索'7'会返回多个结果,“7”& '47'等等,好吧我只是将id改为所有两位数。同时...

我该如何解决这个问题?

    Private Function GetCategoryList() As List(Of Category)
    Dim lst As List(Of Category) = New List(Of Category)

    Using db As New IPCDataDataContext

        lst = (From c In db.Categories
              From t In db.Transfers
              Where t.CategoryIDhash.Contains(c.ID.ToString)
              Select c).ToList()
        Return lst
    End Using
End Function

1 个答案:

答案 0 :(得分:0)

异常意味着Contains只接受可以在SQL中转换为固定变量的参数。因此{@ 1}}之类的东西是可能的,因为Where t.CategoryIDhash.Contains(someVariable.ToString)可以在客户端进行评估。

我真的不明白这个限制,因为在SQL中,完全可以使用someVariable.ToString子句和SQL语句本身构建的字符串。修复问题的声明证明了这一点:

LIKE

这会生成(并执行)SQL,如

lst = (From c In db.Categories
      From t In db.Transfers
      Where SqlMethods.Like(t.CategoryIDhash, "%" + c.ID.ToString "%")
      Select c).ToList()

(其中... WHERE [t1].[CategoryIDhash] LIKE (@p0 + (CONVERT(NVarChar,[t0].[ID]))) + @p1 @p0@p1个字符。

虽然你可以这样做,但我想知道你是否使用这个%走在正确的轨道上。我认为你应该将它转换为FK关系(如果它在你手中修改数据库)。