简单的Linq表达式产生膨胀的where子句对我来说没有意义

时间:2015-12-01 02:52:49

标签: sql vb.net entity-framework linq linqkit

我正在尝试使用这个Linq表达式

Dim ex2 As Expression(Of Func(Of Advertisement, Boolean)) =
    Function(a) a.Address.CountryCode = ISO AndAlso a.Address.Region = EmptyString

以这种方式

Dim ltest = (From a In db.Advertisements.AsExpandable().Where(ex2)).ToList

但它会在条件

的情况下产生这些疯狂
DECLARE @p__linq__0 NVARCHAR (MAX) = N'US';
DECLARE @p__linq__1 NVARCHAR (MAX) = N'';
SELECT [Extent1].[AdvertisementID] AS [AdvertisementID],
       [Extent1].[URL] AS [URL],
       [Extent1].[Address_AddressID] AS [Address_AddressID],
       [Extent1].[Business_BusinessID] AS [Business_BusinessID]
FROM [dbo].[Advertisements] AS [Extent1]
LEFT OUTER JOIN [dbo].[Addresses] AS [Extent2]
             ON [Extent1].[Address_AddressID] = [Extent2].[AddressID]
WHERE (([Extent2].[CountryCode] = @p__linq__0)
       OR (([Extent2].[CountryCode] IS NULL)
           AND (@p__linq__0 IS NULL)))
  AND (([Extent2].[Region] = @p__linq__1)
       OR (([Extent2].[Region] IS NULL)
           AND (@p__linq__1 IS NULL)))

当我的参数是字符串而不是nullables时,我不知道为什么它产生@p__linq__1 IS NULL

我希望它能产生类似

的东西
WHERE [Extent2].[CountryCode] = @p__linq__0 AND [Extent2].[Region] = @p__linq__1

我使用LinqKit谓词而不是表达式尝试了同样的事情但得到了相同的结果。我实际上有一个更复杂的查询与其他where子句但是当它没有工作时我把它分解为这个简单的查询并发现where子句与我的意图完全不同。

所以问题是生成一个更简单的where子句的正确方法是什么,类似于我使用LinqKit表达式或谓词所使用的?

1 个答案:

答案 0 :(得分:0)

  

是否有类似于我可以使用的字符串的东西,它可能是null,可能会删除额外的SQL?

您可以尝试向表达式添加一个要求,以保证字符串不为空:

a.Address.CountryCode = ISO _
    AndAlso Not EmptyString Is Nothing _
    AndAlso a.Address.Region = EmptyString

但是,EF生成的SQL意味着完全表示传入的表达式(包括空语义的差异),而不一定要完全优化或人类可读。这意味着SQL生成器可能无法通过添加该需求来生成您期望的 exact sql。

或者,如果EmptyString是"常数"值实际上是一个空字符串,您可以尝试使用String.Empty。解释器可以在查询中使用常量值,而不是使用参数。