LinqToSql генерирует неверный запрос к базе данных - PullRequest
0 голосов
/ 16 ноября 2011

У меня проблема с 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

1 Ответ

1 голос
/ 16 ноября 2011

Вы звоните Содержит результат вызова Select (), который отличается от вызова его в строковом поле.Генерируемый код в точности соответствует тому, что вы написали.

Так как вы вызвали Contains () таким образом, он проверяет равенство для каждого элемента в возвращенной коллекции.

...