2009-02-23 14 views
25

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) 

答えて

39

試してみてください。私はがString.CompareToは、SQLにLINQで動作を知らない

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

、それは最初に試してみることです。

は、(通常は、比較の右の種類を指定するには、StringComparerを使用する必要がありますが、私はこの場合のCompareToがより良い選択肢であるに疑いがある。)

+0

これは動作しますが、どのような方法は、外の汎用拡張メソッドを作ることはありませんそれ?私はそれを少し演奏しましたが、L2Sが翻訳できるものはありませんでした。 IEnumerablesで動作しました。 – andleer