Проблемы со сравнением строк в LINQ - PullRequest
25 голосов
/ 23 февраля 2009

У меня проблемы с получением LINQ для перевода чего-либо в нужный мне запрос. В T-SQL мы проводим сравнение <= и> = для трех столбцов, которые являются столбцами CHAR (6). LINQ не позволит мне сделать это, так как

Оператор '<=' не может быть применен к операнды типа «строка» - «строка». </p>

У меня следующий запрос T-SQL ..

SELECT * 
FROM [ZIPMASTER] zm
WHERE zm.CORP = 12 
AND '85546 ' BETWEEN zm.ZIPBEG AND zm.ZIPEND

Вышесказанное не очень дружелюбно по отношению к LINQ, поскольку поддержка BETWEEN отсутствует. Таким образом, я упростил до следующего:

SELECT *
FROM [ZIPMASTER] zm
WHERE zm.CORP = 12
AND zm.ZIPBEG <= '85546 '
AND zm.ZIPEND >= '85546 '

Который я использовал для создания следующего запроса LINQ:

var zipLinqQuery =
    from z in db.ZIPMASTERs
    where z.CORP == 12
    && z.ZIPBEG <= "85546 "
    && z.ZIPEND >= "85546 "
    select z;
List<ZIPMASTER> zips = zipLinqQuery.ToList<ZIPMASTER>();

C # - LINQ не очень нравится этот запрос. Я попытался преобразовать в целые, а затем сравнить, однако, в некоторых случаях почтовый индекс может содержать букву. Например, следующее выражение будет иметь значение true в T-SQL:

WHERE '85546B' BETWEEN '85546A' AND '85546D'

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

В любом случае, любая помощь, которую вы можете оказать, очень ценится. Заранее спасибо.

CJAM

Решение (опубликовано Джоном Скитом):

Похоже, что string.CompareTo () фактически генерирует необходимый T-SQL. Примеры ниже:

var zipLinqQuery =
    from z in db.ZIPMASTERs
    where z.CORP == listItem.CORP
    && z.ZIPBEG.CompareTo(listItem.ZIPCODE) <= 0
    && z.ZIPEND.CompareTo(listItem.ZIPCODE) >= 0
    select z;

Создает следующий T-SQL:

DECLARE @p0 INT, @p1 CHAR(6), @p2 CHAR(6)
SET @p0 = 12
SET @p1 = '85546 '
SET @p2 = '85546 '

SELECT [t0].[CORP], [t0].[ZIPEND], [t0].[ZIPBEG], [t0].[CITY], [t0].[STATE], [t0].[CYCLE]
FROM [dbo].[ZIPMASTER] AS [t0]
WHERE ([t0].[CORP] = @p0) AND ([t0].[ZIPBEG] <= @p1) AND ([t0].[ZIPEND] >= @p2)

1 Ответ

39 голосов
/ 23 февраля 2009

Попробуйте:

var zipLinqQuery =
    from z in db.ZIPMASTERs
    where z.CORP == 12
    && z.ZIPBEG.CompareTo("85546 ") <= 0
    && z.ZIPEND.CompareTo("85546 ") >= 0
    select z;

Я не знаю , что String.CompareTo работает в LINQ to SQL, но это первое, что нужно попробовать.

(Обычно вы должны использовать StringComparer для указания правильного типа сравнения, но я подозреваю, что в этом случае CompareTo - лучший вариант.)

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