0

実行時にこのエラーを生成する非常に単純なクエリがあります。クライアントで評価できる引数のみが String.Contains メソッドでサポートされています。

クエリは、転送が割り当てられているカテゴリのみを検索することになっています。転送は複数のカテゴリにリストできるため、表の関係はありません。Categoryidhash には、「7~34~25~42~47」のようなデータが含まれています。これを書いているときに、'7' を検索すると "7" と '47' などの複数の結果が返されることに気付きました。その間...

どうすればこれを修正できますか?

    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
4

1 に答える 1

0

例外はContains、SQL で固定変数に変換できる引数のみを受け入れることを意味します。クライアント側で評価できるため、次のようなWhere t.CategoryIDhash.Contains(someVariable.ToString)ことが可能です。someVariable.ToString

LIKESQLでは、SQL ステートメント自体に組み込まれている文字列を含む句を完全に使用できるため、この制限がよくわかりません。これは、問題を修正するステートメントによって示されます。

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

これは、次のような SQL を生成 (および実行) します。

...
WHERE [t1].[CategoryIDhash] LIKE (@p0 + (CONVERT(NVarChar,[t0].[ID]))) + @p1

(@p0@p1%文字です。

これはできますが、これを使用して正しい軌道に乗っているかどうかは疑問ですCategoryIDhash。FK関係に変換する必要があると思います(データベースを変更する必要がある場合)。

于 2013-07-13T22:20:19.000 に答える