Простое выражение Linq, создающее раздутый оператор where, что не имеет смысла для меня

Я пытаюсь использовать это выражение 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 совершенно не похоже на то, что я намеревался.

Таким образом, вопрос в том, как правильно создать более простое предложение where, подобное тому, что я использовал, используя выражения или предикаты LinqKit?

1 ответ

Есть ли что-то похожее на строку, которую я могу использовать, которая не может быть нулевой, что может удалить дополнительный sql?

Вы можете попробовать добавить требование к выражению, которое гарантирует, что строка не равна нулю:

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

Однако SQL, сгенерированный EF, предназначен для точного представления переданных выражений (включая различия в нулевой семантике) и не обязательно должен быть полностью оптимизирован или удобочитаем для человека. Это означает, что генератор SQL может не генерировать точный SQL, который вы ожидаете, добавив это требование.

Или еслиEmptyString является "постоянным" значением, которое является буквально пустой строкой, вы можете попробовать использовать String.Empty вместо. Интерпретатор может использовать постоянное значение в запросе вместо использования параметра.

Другие вопросы по тегам