2011-11-16 81 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(),它正在测试返回集合中每个项目上的相等性。