0

LinqToSql と PredicateBuilder に問題があります

次のコードがあります

Dim vQuery As IQueryable(Of Table1) = pContext.Table1
Dim predicate As Expression(Of System.Func(Of Table1, Boolean)) = Nothing

....

Dim predicateAdd As Expression(Of System.Func(Of Table1, Boolean)) = PredicateBuilder.True(Of Table1)()

predicateAdd = predicateAdd.And(Function(a As Table1) a.Table2.Table3.Select(Function(c) c.Column1).Contains(TextToSearch))

predicate = predicate.And(predicateAdd)

....

Me.Grid.DataSource = vQuery.Where(predicate)

データベースに対して次のクエリを生成します

SELECT [t0].[ID], ...
FROM [dbo].[Table1] AS [t0]
WHERE EXISTS(
    SELECT NULL AS [EMPTY]
    FROM [dbo].[Table2] AS [t1], [dbo].[Table3] AS [t2]
    WHERE ([t2].[Column1] = @p0) AND ([t1].[ID] = [t0].[ID]) AND ([t2].[ID] = [t1].[ID])
    )   
-- @p0 is TextToSearch

しかし、それは私が望むものではありません。

このコード行

a.Table2.Table3.Select(Function(c) c.Column1).Contains(TextToSearch)

データベースへの次のクエリを生成する必要があります

WHERE ([t2].[Column1] Like @p0)

しかし、これではありません

WHERE ([t2].[Column1] = @p0)

どこかで間違っている場合、またはこれは LinqToSql のバグですか?

4

1 に答える 1

1

Select() の呼び出しの結果に対して、Contains を呼び出しています。これは、文字列フィールドに対して呼び出すのとは異なります。生成されたコードは、あなたが書いたものにぴったりです。

そのように Contains() を呼び出したので、返されたコレクション内の各項目が等しいかどうかをテストしています。

于 2011-11-16T12:48:35.093 に答える