我有一个很直接的查询,它在运行时产生这个错误: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
答案 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关系(如果它在你手中修改数据库)。