Линк странный или я тупой? - PullRequest
2 голосов
/ 28 января 2009

Почему это работает:

result = (from e in db.CampaignCodes where e.Code.Equals("") && 
e.Domain.Equals(null) select e).FirstOrDefault();

Но нет (результат равен нулю):

String code = "";
String domain = null;

result = (from e in db.CampaignCodes where e.Code.Equals(code) &&
 e.Domain.Equals(domain) select e).FirstOrDefault();

??

Ответы [ 4 ]

6 голосов
/ 28 января 2009

Чтобы расширить ответ Иана:

В зависимости от того, какие существуют перегрузки в e.Domain.Equals (), передача пустой строковой переменной может отличаться от передачи нулевой переменной? Я не уверен, какие правила будут здесь, но я подозреваю, что компилятор может предпочесть e.Domain.Equals (переменная объекта), а не e.Domain.Equals (строковая переменная), когда явно задано «просто» ноль, а не строковая переменная, которая была установлена ​​как нуль?

4 голосов
/ 28 января 2009

Это действительно звучит довольно странно. LINQ to SQL может хорошо заметить разницу между получением значения из переменной и получением его из константы, но я бы не ожидал, что это будет иметь какое-либо значение.

Я настоятельно рекомендую, чтобы всякий раз, когда LINQ to SQL вел себя странно, вы включали вход в контекст и видели, какой запрос он фактически выполняет в каждом случае.

РЕДАКТИРОВАТЬ: Другие ответы по аспекту перегрузки действительно интересны. Что произойдет, если вы объявите переменную domain как тип object вместо string во втором запросе или приведете значения null к string в первом запросе?

4 голосов
/ 28 января 2009

пустая строка - домен - это не то же самое, что просто передать нулевое значение?

1 голос
/ 28 января 2009

Выясни это через логирование, вот мои результаты:

Я получаю следующие результаты:

Работает:

(from e in CampaignCodes where e.Code.Equals(code) && e.Domain.Equals(null) select e).FirstOrDefault().Dump();

SELECT TOP (1) [t0].[Id], [t0].[Code], [t0].[Domain], [t0].[ClientId], [t0].[CampaignId], [t0].[PathId], [t0].[DescriptionText], [t0].[DeleteFlag], [t0].[Created]
FROM [CampaignCodes] AS [t0]
WHERE ([t0].[Code] = @p0) AND ([t0].[Domain] IS NULL)
-- @p0: Input NVarChar (Size = 0; Prec = 0; Scale = 0) []
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8

не работает:

(from e in CampaignCodes where e.Code.Equals(code) && e.Domain.Equals(domain) select e).FirstOrDefault().Dump();

SELECT TOP (1) [t0].[Id], [t0].[Code], [t0].[Domain], [t0].[ClientId], [t0].[CampaignId], [t0].[PathId], [t0].[DescriptionText], [t0].[DeleteFlag], [t0].[Created]
FROM [CampaignCodes] AS [t0]
WHERE ([t0].[Code] = @p0) AND ([t0].[Domain] = @p1)
-- @p0: Input NVarChar (Size = 0; Prec = 0; Scale = 0) []
-- @p1: Input NVarChar (Size = 0; Prec = 0; Scale = 0) [Null]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.

8

так

Переписав мой linq2sql в:

(from e in CampaignCodes where e.Code.Equals(code) && ((domain==null && e.Domain.Equals(null))||e.Domain.Equals(domain)) select e).FirstOrDefault().Dump();

Я получаю:

SELECT TOP (1) [t0].[Id], [t0].[Code], [t0].[Domain], [t0].[ClientId], [t0].[CampaignId], [t0].[PathId], [t0].[DescriptionText], [t0].[DeleteFlag], [t0].[Created]
FROM [CampaignCodes] AS [t0]
WHERE ([t0].[Code] = @p0) AND ([t0].[Domain] = @p1)
-- @p0: Input NVarChar (Size = 4; Prec = 0; Scale = 0) [test]
-- @p1: Input NVarChar (Size = 14; Prec = 0; Scale = 0) [mydomain.se]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8

Когда домен не нулевой и:

SELECT TOP (1) [t0].[Id], [t0].[Code], [t0].[Domain], [t0].[ClientId], [t0].[CampaignId], [t0].[PathId], [t0].[DescriptionText], [t0].[DeleteFlag], [t0].[Created]
FROM [CampaignCodes] AS [t0]
WHERE ([t0].[Code] = @p0) AND (([t0].[Domain] IS NULL) OR ([t0].[Domain] = @p1))
-- @p0: Input NVarChar (Size = 4; Prec = 0; Scale = 0) [test]
-- @p1: Input NVarChar (Size = 0; Prec = 0; Scale = 0) [Null]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8

Когда это так.

Но я надеялся, что для этого найдутся отличные методы ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...