Tôi nghĩ rằng việc so sánh dưới dạng chuỗi khá an toàn, trừ khi bạn có năm <1000 hoặc> 9999:
... dr.stringYear.CompareTo(myNumberString) > 0
EF dịch điều này thành một vị từ SQL như
WHERE [alias].[stringYear] > @p
có thể trong SQL nhưng không thể trong C #.
Một lợi thế là bất kỳ chỉ mục nào trên stringYear
có thể được sử dụng trong một kế hoạch thực thi. Chuyển đổi stringYear
để đánh số loại bỏ bất kỳ chỉ mục nào.
Phương thức này vẫn hữu ích khi cột chuỗi chứa các giá trị chuỗi răng cưa. Trong trường hợp như vậy, vị từ nên được kết hợp với Độ dài. Ví dụ:để tìm tất cả các thực thể trong đó bất kỳ chuỗi số nào dưới dạng số nguyên đều lớn hơn một số giá trị tham chiếu
var len = myNumberString.Lenght;
var query =
from row in context.LegacyTable
where row.NumericString.CompareTo(myNumberString) > 0
&& row.NumericString.Length >= len
select row;
Sau đó, công cụ truy vấn không thể sử dụng các chỉ mục để so sánh độ dài nhưng nó có thể làm như vậy cho >
so sánh.