0

我正在尝试使用这个 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)))

我不知道为什么@p__linq__1 IS NULL当我的参数是字符串而不是可空值时它会产生。

我希望它会产生类似的东西

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

我使用 LinqKit 谓词而不是表达式尝试了同样的事情,但得到了相同的结果。实际上,我有一个带有附加 where 子句的更复杂的查询,但是当它不起作用时,我将其分解为这个简单的查询,发现 where 子句与我的预期完全不同。

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

4

1 回答 1

0

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

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

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

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

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

于 2015-12-01T22:29:25.313 回答