[英]Converting string to int in linq to entities on big database
我想將 linq 中的字符串轉換為 int 到實體,但 Convert.ToInt32 和 int.Parse 無法轉換為 sql 而且我的數據庫很大,無法將它們全部放入內存(超過 60k 記錄並變得更大)我的查詢類似於
int myNumber = 1390;
var result = from dr in myEntitiy.TableX
where (Convert.ToInt32(dr.stringYear) > myNumber) // <== error
select dr;
錯誤說無法翻譯轉換方法
LINQ to Entities 無法識別方法 'Int32 ToInt32(System.String)' 方法,並且此方法無法轉換為存儲表達式。
什么解決方案
更新:如果沒有辦法做到這一點,請讓我確定這一點,然后我必須更改數據庫中的字段類型,但這會很難:(
我認為將比較作為字符串進行比較是很安全的,除非您的年數 < 1000 或 > 9999:
... dr.stringYear.CompareTo(myNumberString) > 0
EF 將其轉換為 SQL 謂詞,如
WHERE [alias].[stringYear] > @p
這在 SQL 中是可能的,但在 C# 中是不可能的。
一個優點是stringYear
上的任何索引都可以在執行計划中使用。 將stringYear
轉換為 number 會消除任何索引。
當字符串列包含鋸齒狀字符串值時,此方法仍然有用。 在這種情況下,謂詞應與 Length 結合使用。 例如,要查找作為整數的任何數字字符串大於某個參考值的所有實體
var len = myNumberString.Lenght;
var query =
from row in context.LegacyTable
where row.NumericString.CompareTo(myNumberString) > 0
&& row.NumericString.Length >= len
select row;
然后查詢引擎不能使用索引進行長度比較,但它可能能夠為>
比較這樣做。
這有效,但生成的 SQL 會很亂
int myNumber = 1390;
var result = from dr in myEntitiy.TableX
let num = myEntitiy.TableX.Take(1).Select(x => dr.stringYear).Cast<int>().FirstOrDefault()
where num > myNumber
select dr;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.