LINQを使用して、必要なクエリに何かを翻訳できない場合があります。 T-SQLでは、CHAR(6)列である3つの列に対して< =と> =の比較を行います。 LINQは私が「文字列」にタイプ「文字列」の オペランドに適用することはできません問題LINQでの文字列比較の実行
演算子「< =」ので、これを実行することはできません。
BETWEEN
がサポートされていないので、
私は、次のT-SQLクエリを持っている...
SELECT *
FROM [ZIPMASTER] zm
WHERE zm.CORP = 12
AND '85546 ' BETWEEN zm.ZIPBEG AND zm.ZIPEND
上記は、非常にfreindly LINQではありません。このように、私は次のように簡略化されています:私は、次のLINQクエリを作成するために使用されている
SELECT *
FROM [ZIPMASTER] zm
WHERE zm.CORP = 12
AND zm.ZIPBEG <= '85546 '
AND zm.ZIPEND >= '85546 '
は:
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はあまりこのクエリを好きにされていません。私はintに変換して比較しようとしましたが、場合によっては郵便番号に文字が含まれていることがあります。たとえば、次の式は、T-SQLでtrueに評価されます:
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)
これは動作しますが、どのような方法は、外の汎用拡張メソッドを作ることはありませんそれ?私はそれを少し演奏しましたが、L2Sが翻訳できるものはありませんでした。 IEnumerablesで動作しました。 – andleer