2009-02-23 44 views
25

Tôi đang gặp khó khăn khi LINQ dịch một thứ gì đó vào truy vấn tôi cần. Trong T-SQL, chúng tôi thực hiện < = và> = so sánh trên ba cột có CHAR (6) cột. LINQ sẽ không cho phép tôi thực hiện việc này kể từCác vấn đề khi so sánh chuỗi trong LINQ

Toán tử '< =' không thể áp dụng cho toán hạng loại 'chuỗi' thành 'chuỗi'.

Tôi có truy vấn T-SQL sau ..

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

Trên đây không phải là rất LINQ freindly, vì không có sự hỗ trợ cho BETWEEN. Vì vậy, tôi đã đơn giản hóa như sau:

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

Mà tôi đã sử dụng để tạo ra các truy vấn LINQ sau:

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 không thích truy vấn này quá nhiều. Tôi đã thử chuyển đổi sang int và sau đó so sánh, tuy nhiên, trong một số trường hợp, mã zip có thể chứa một chữ cái. Ví dụ, biểu thức sau đây sẽ đánh giá là true trong T-SQL:

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

Tôi không biết chính xác lý do tại sao nó hoạt động trong T-SQL, nhưng tôi đoán là nó so sánh từng nhân vật trong mảng riêng bởi chuyển nó thành giá trị ASCII bằng số.

Dù sao, mọi trợ giúp bạn có thể cung cấp đều được đánh giá cao. Cảm ơn trước.

CJAM

Solution (được đăng bởi Jon Skeet):

Dường như string.CompareTo() thực hiện trên thực tế tạo ra cần T-SQL. Ví dụ dưới đây:

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ạo T-SQL sau:

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) 

Trả lời

39

Hãy thử:

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

Tôi không biết rằng String.CompareTo làm việc trong LINQ to SQL, nhưng đó là điều đầu tiên để thử.

(Thông thường bạn nên sử dụng một StringComparer để xác định đúng loại so sánh, nhưng tôi nghi ngờ trong trường hợp này CompareTo là lựa chọn tốt hơn.)

+0

này không làm việc nhưng bất kỳ cách nào để thực hiện một phương pháp mở rộng mục đích chung ra khỏi nó? Tôi đã chơi với nó một chút nhưng không thể nghĩ ra bất cứ thứ gì mà L2S có thể dịch. Đã làm việc cho IEnumerables. – andleer