У меня возникли проблемы с получением LINQ для перевода чего-либо в требуемый мне запрос. В T-SQL мы сопоставляем <= и >= три столбца, которые являются столбцами CHAR (6). LINQ не позволит мне это делать, поскольку
Оператор '< =' не может применяться к операнды типа 'string' в 'string'.
У меня есть следующий запрос 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>();
С# - LINQ не очень нравится этот запрос. Я попытался преобразовать в ints и затем сравнить, однако, в некоторых случаях почтовый индекс может содержать букву. Например, следующее выражение будет оценивать значение true в T-SQL:
WHERE '85546B' BETWEEN '85546A' AND '85546D'
Я не знаю точно, почему он работает в T-SQL, но я предполагаю, что он сравнивает каждый символ в массиве индивидуально, преобразовывая его в числовое значение ASCII.
В любом случае, любая помощь, которую вы все можете предоставить, очень ценится. Спасибо заранее.
CJAM
Решение (опубликовано Jon Skeet):
Похоже, что 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)