我正在尝试使用这个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表达式或谓词所使用的?
答案 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
。解释器可以在查询中使用常量值,而不是使用参数。