2011-11-16 83 views
0

我有LinqToSql和PredicateBuilderLinqToSql生成對數據庫中的不正確的查詢

一個問題

我有下面的代碼段

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

您正在調用包含對Select()的調用的結果,這與在字符串字段上調用該結果不同。正在生成的代碼完全適合您所寫的內容。

由於您以這種方式調用了Contains(),它正在測試返回集合中每個項目上的相等性。