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パラメータが文字列でnullableではない場合、なぜそれが生成されるのかわかりません。

私はそれが次のようなものを生み出すことを期待しています

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

式の代わりに LinqKit 述語を使用して同じことを試みましたが、同じ結果が得られました。私は実際には where 句を追加したもっと複雑なクエリを持っていますが、それがうまくいかなかったときに、この単純なクエリだけに分解したところ、where 句が意図したものとはまったく異なることがわかりました。

問題は、LinqKit 式または述語を使用して意図したものに似た、より単純な where 句を生成する適切な方法は何ですか?

4

1 に答える 1

0

追加のSQLを削除する可能性のあるnullにできない、使用できる文字列に似たものはありますか?

文字列が null でないことを保証する要件を式に追加してみてください。

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 に答える