LINQ

2009-02-23 23 views
25

Dize Karşılaştırması Yapıyor Sorunlar LINQ'a ihtiyacım olan sorguya bir şey çevirmesi konusunda sorun yaşıyorum. T-SQL'de < = ve CHAR (6) sütunları olan üç sütun üzerinde karşılaştırma yapıyoruz. LINQ bana 'string' türü 'dizesi' arasında işlenen uygulanan edilemezLINQ

Operatör '< =' beri bunu yapmasına izin vermez.

Ben BETWEEN için destek olmadığından yukarıda çok LINQ freindly değildir ..

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

aşağıdaki T-SQL sorgusu var. Böylece, aşağıdaki basitleştirilmiş var: Aşağıdaki LINQ sorgu oluşturmak için kullandık

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 çok fazla bu sorguyu sevme değil. Ben ints dönüştürmeyi denedim ve daha sonra karşılaştırarak, bazı durumlarda posta kodu bir harf içerebilir. Örneğin, aşağıdaki ifade T-SQL true değerlendirirsiniz:

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

o T-SQL çalışır, ancak benim tahminim tarafından ayrı ayrı dizide her bir karakteri karşılaştırır olmasıdır tam olarak neden bilmiyorum sayısal ASCII değerine dönüştürülür.

Her halükarda, size sağlayabileceğiniz her türlü yardım büyük beğeni topluyor. Şimdiden teşekkürler. (Jon Skeet tarafından gönderildi)

CJAM

Çözüm:

O string.CompareTo() aslında gerekli T-SQL oluşturmak yapar anlaşılmaktadır. Aşağıdaki örnekler:

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; 

aşağıdaki T-SQL üretir:

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) 

cevap

39

Dene: Ben String.CompareTo LINQ to SQL çalışır bilmiyorum

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

, ama denenecek ilk şey.

(Normalde karşılaştırmanın doğru türünü belirtmek için bir StringComparer kullanmalısınız, ama bu durumda CompareTo daha iyi bir seçenektir içinde şüpheli.)

+0

Bu çalışma ancak herhangi bir şekilde dışarı genel amaçlı uzantısı yöntemi yapmak için gelmez o? Bununla biraz oynadım ama L2S'nin çevirebileceği hiçbir şeyle gelemedim. IEnumerables için iş yaptım. – andleer