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)
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